var data=from l in books group l by lfenlei into bb select new {FenLeiList= bbfenlei }
得到分类集合,填充到界面上的选择框之类的控件在其事件里加入
var data=from l in books where lfenlei==控件text select l
得到所选分类的书的集合
在一个10000次的循环中,直接使用Linq效率肯定不会高的。因为每次循环中都需要构造
var va = from n in csVos where nCamps == test1 select n
----------
采用Linq动态扩展方法,效率肯定比原来的Linq更好些
DateTime now = DateTimeNow;List<ConnectionSocket> tcsVos = new List<ConnectionSocket>();
for (int i = 0; i < 10000; i++)
{
int test1 = rdNext(10000);
ConnectionSocket item = csVosFirstOrDefault(o=>oCamps==test1);
//var va = from n in csVos where nCamps == test1 select n;
//if (vaAny())
if(item != null)
{
tcsVosAdd(item);
}
}
DteTime end = DateTimeNow;
double temp = (end - now)TotalMilliseconds;
linq是面向对象的sql。也就是说,sql是向关系型数据库的查询,而linq实际上是对内存里的数据的查询。
虽然linq原来是对象查询,但经过ms的努力,可以通过表达式分析与实体到关系的映射(linq to sql),把linq转换为sql语句或是对xml的查询(linq to xml)。
因此,这种技术就成了对象到数据库记录的一个方便的映射、转化与 *** 作的工具,你再也不必去去根据不同的情况用字符串拼接的办法生成sql,而是专心于对象模型的处理即可,你对于对象的修改最终都会被转换为对应的update, insert, delete等sql语句,在你submit时全部提交到数据库中。
综尔言之,linq to sql是一个数据库到对象结构的一个中间层, 他把对关系数据的管理转变为对象的 *** 作,屏蔽了麻烦的sql,而且,还可以得到vs强大的智能感知功能的帮助。
LINQ,语言集成查询(Language INtegrated Query)是一组用于c#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式 *** 作内存数据。
基本概念
从技术角度而言,LINQ定义了大约40个查询 *** 作符,如select、from、in、where以及orderby(C#)中。试用这些 *** 作可以编写查询语句。不过,这些查询还可以基于很多类型的数据,每个数据类型都需要一个单独的LINQ类型。 经过了最近 20 年,面向对象编程技术( object-oriented (OO) programming technologies )在工业领域的应用已经进入了一个稳定的发展阶段。程序员现在都已经认同像 类(classes)、对象(objects)、方法(methods)这样的语言特性。考察现在和下一代的技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术诞生以来并没有解决降低访问和整合信息数据( accessing and integrating information )的复杂度的问题。其中两个最主要访问的数据源与数据库( database )和 XML 相关。 LINQ 提供了一条更常规的途径即给 Net Framework 添加一些可以应用于所有信息源( all sources of information )的具有多种用途( general-purpose )的语法查询特性( query facilities ),这是比向开发语言和运行时( runtime )添加一些关系数据( relational )特性或者类似 XML 特性( XML-specific )更好的方式。这些语法特性就叫做 NET Language Integrated Query (LINQ) 。 包含 DLinq 和 XLinq
基础知识
1 LINQ的读法:(1)lin k (2)lin q 2 LINQ的关键词:from, select, in, where, group by, order by … 3 LINQ的注意点:必须以select或者是group by 结束。 4 LINQ的语义: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量中被查询的值 [group by 条件] LINQ的查询返回值的类型是临时变量的类型,可能是一个对象也可能是一个集合。并且LINQ的查询表达式是在最近一次创建对象时才被编译的。LINQ的查询一般跟var关键字一起联用 (什么是var?匿名对象) 。 5 LINQ的全称:Language-Integrated Query 6 LINQ的分类:LINQ to Object, LINQ to XML, LINQ to SQL, LINQ to ADONET 7 命名空间:SystemLinq; 注意:Linq是在NET Framework 35 中出现的技术,所以在创建新项目的时候必须要选35或者更高版本,否则无法使用。 选择35或更高版本的NET Framework之后,创建的新项目中会自动包含SystemLinq的命名空间。
语法实例
C#30 LINQ 查询语法 首先来看一个很简单的LINQ查询例子,查询一个int 数组中小于5的数字,并按照大小顺序排列: class Program { static void Main(string[] args) { int[] arr = new int[] { 8, 5, 89, 3, 56, 4, 1, 58 }; var m = from n in arr where n < 5 orderby n select n; foreach (var n in m) { ConsoleWriteLine(n); } ConsoleReadLine(); } } 上述代码除了LINQ查询语法外,其他都是我们所熟悉的语法,而LINQ查询语法跟SQL查询语法很相似,除了先后顺序。 Q:为何 LINQ 查询语法是以 from 关键字开头的,而不是以 select 关键字开头的?select 开头这种写法跟SQL的写法更接近,更易懂呀? A:简单来说,为了IDE的智能感知(Intelisence)这个功能,select 关键字放在后面了。 编程语言以 select 开头写LINQ查询语法不是没出现过,你如果使用过2005年的VB9 CTP 版本,那时候VB9的LINQ查询语法就是 select 关键字在前面,但是 select 关键字在前面,在做智能感知(Intelisence)时候就很头大。经过微软IDE组的权衡,确定了把 from 关键字放在最前面。 那时候 VB9 LINQ的查询语法还是 select 参数在最前面。不过后来 VB9 测试版改成了跟 C# 一样的做法, from 关键字放在最前面了。 更详细的解释,来自装配脑袋 假设你要书写这样的代码:Select pName, pAge From p In persons Where xxx ,代码是一个个字符输入的。 我们在写到 p in persons 之前,p 的类型是无法推测的,所以写 Select p 的时候,Name之类的属性不会d出智能提示来。 这样就需要先去写 From 这句,再回来写 Select。 微软IDE组经过反复考虑决定,还不如就把 Select 写到后面了。于是编程语言中的写法就确定这样来写了。 VB9 的这个变化可以参看这篇博客: Select/From vs From/Select revisited 我们再来看一个稍稍复杂的LINQ查询: 在我们罗列的语言字符串中,我们希望按照字符长短,分类罗列出来,实现代码如下: static void Main(string[] args) { string [] languages = {"Java","C#","C++","Delphi","VBnet","VCnet","C++ Builder","Kylix","Perl","Python"}; var query = from item in languages orderby item group item by itemLength into lengthGroups orderby lengthGroupsKey descending select lengthGroups; foreach (var item in query) { ConsoleWriteLine("strings of length {0}",itemKey); foreach (var val in item) { ConsoleWriteLine(val); } } ConsoleReadLine(); } 其中的 into 关键字表示 将前一个查询的结果视为后续查询的生成器,这里是跟 group by 一起使用的。 LINQ中的Group by不要跟 SQL 中的Group by 混淆,SQL 由于是二维结构,Group by 的一些逻辑受二维结构的约束,无法像 LINQ 中的Group by 这么灵活。
Linq的内部执行原理浅析
LINQ(Language Integrated Query)是Visual Studio 2008中的****。借助于LINQ技术,我们可以使用一种类似SQL的语法来查询任何形式的数据。目前为止LINQ所支持的数据源有SQL Server、XML以及内存中的数据集合。开发人员也可以使用其提供的扩展框架添加更多的数据源,例如MySQL、Amazon甚至是Google Desktop。 一般来讲,这类查询语句的一个重要特点就是可以并行化执行。虽然有些情况下并行可能会带来一些问题,但这种情况非常少见。这样也就水到渠成地引出了PLINQ这个并行处理的LINQ类库。 PLINQ原名为Parallel LINQ,支持XML和内存中的数据集合。执行于远程服务器上的查询语句(例如LINQ to SQL)显然无法实现这个功能。 将LINQ语句转换为PLINQ语句极为简单——只需要在查询语句中From子句所指定的数据源的最后添加AsParallel()即可。随后Where、OrderBy和Select子句将自动改为调用这个并行的LINQ版本。 据MSDN Magazine介绍,PLINQ可以以三种方式执行。第一种是管道处理:一个线程用来读取数据源,而其他的线程则用来处理查询语句,二者同步进行——虽然这个单一的消费线程可能并不那么容易与多个生产线程同步。不过若是能够仔细配置好负载平衡的话,仍然会极大地减少内存占用。 第二种模式叫做“stop and go”,用于处理结果集需要被一次返回时(例如调用ToList、ToArray或对结果排序)的情况。在这种模式下,将依次完成各个处理过程,并将结果统一返回给消费线程。这个模式在性能上将优于第一种模式,因为它省去了用来保持线程同步所花费的开销。 最后一种方法叫做“inverted enumeration”。该方法并不需要实现收集到所有的输出,然后在单一的线程中处理,而是将最终调用的函数通过ForAll扩展传递到每个线程中。这是目前为止最快的一种处理模式,不过这需要传递到ForAll中的函数是线程安全的,且最好不包含任何lock之类的互斥语句。 若是PLINQ中任意的一个线程抛出异常,那么所有的其他线程将会被终止。若是抛出了多个异常,那么这些异常将被组合成一个MultipleFailuresException类型的异常,但每个异常的调用堆栈仍会被保留。 关于LINQ的技巧从大的方面来看它能给开发团队带来的好处: 1、无需复杂学习过程即可上手 2、编写更少代码即可创建完整应用。 3、更快开发错误更少的应用程序。 4、无需求助奇怪的编程技巧就可合并数据源。 5、让新开发者开发效率更高。
var getBookName = from bookname in pdcBookInfo
where ConvertToDouble(booknamePrice) >200
select bookname;
具体方法如下:
匿名类型的传递
static void Main(string[] args)
{
var User = GetAnonymous()Cast(new { UserName = "", LastLoginIp = "" });
ConsoleWrite(UserUserName);
}
static object GetAnonymous()
{
var User = new { UserName = "yaosansi", LastLoginIp = "127001" };
return User;
}
当定义一个匿名类型,只能通过object类型传递,传递后编译器将无法获悉匿名类型的实际类型。
这行可以通过Cast扩展方法来进行强制转换。以下是Cast方法的原型。
public static T Cast<T>(this object o, T t)
{
return (T)o;
}
生成匿名类型的List
var User = GetAnonymous()Cast(new { UserName = "", LastLoginIp = "" });
var list = new List<>();
原理和上面一致。
var User = new { UserName = "yaosansi", LastLoginIp = "127001" };
var list = UserMakeList();
listAdd(User);
ConsoleWrite(list[0]UserName);
MakeList()方法:
public static List<T> MakeList<T>(this T t)
{
return new List<T>();
}
在List中Add一个User:
public static List<T> MakeList<T>(this T t,params T[] items)
{
return new List<T>(items);
}
这时调用的时候可以写成:
var User = new { UserName = "yaosansi", LastLoginIp = "127001" };
var list = UserMakeList(User);
ConsoleWrite(list[0]UserName);
LINQ中是多表查询的。
var q =
from p in dbProducts
where pSupplierCountry == "USA" && pUnitsInStock == 0
select p;
以上的查询是两个有关系的表,并且返回的只是一个表的内容,
这种情况下可以在数据层中返回强类型的List。如:
public List<Products> SelectProducts()
{
var q =
from p in dbProducts
where pSupplierCountry == "USA" && pUnitsInStock == 0
select p;
return qToList<Products>;
}
如果返回的是单行数据的结果集就可以前面提到的
使用 匿名类型的传递 得到需要的结果
public object SelectProducts()
{
var q =
from p in dbProducts
where pSupplierCountry == "USA" && pUnitsInStock == 0
select new {pUnitsInStock,pSupplierSid};
var result = qSingle();
return result;
}
这个前提是业务逻辑层需要知道数据层的匿名类型中的具体类型。
方法一:
自定义与返回类型相同结构的类,
public class CustomQuery
{
public uint UnitsInStock { get; set; }
public int Sid { get; set; }
}
这样在查询结果为多个表的结果集时,就可以解决了。
以上就是关于C#中LINQ查询语句,在一个数组里面通过一个条件查询另外一个数据出来,如下:全部的内容,包括:C#中LINQ查询语句,在一个数组里面通过一个条件查询另外一个数据出来,如下:、关于linq的效率问题、求总结linq与sql语法比较等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)