首页 > 代码库 > Linq语法

Linq语法

Linq简介:

什么是Linq:语言集成查询,和C#的集合的扩展方法作用类似
辟谣:Linq to sql微软已经不再推荐使用,但Linq to object 和Linq to entity(重点发展)任然在发展

Linq to object操作的是内存中的数据,Linq to Entity操作的是EF中的数据,这两者结合起来使用就需要注意一些问题了:
1、Linq to object join Linq to Entity,使用这样的方式进行连接查询时,无论如何写数据的过滤条件,都会造成EF进行全表扫描。但是我们不用对object数据进行处理就可以实现连接查询。
2、Linq to Entity join Linq to object ,使用这种方式我们写上数据的过滤条件后,就不会照成ef进行全表扫描,但是我们用于连接的object数据只能是Int32 ,String,Guid等基元数据,我们在进行连接查询时要提前把数据处理好。
注:Linq to Entity查询数据时,在没有遍历数据前(ToList(),ToArray()等,也就是数据还没有被拿到本地内存),表达式中不能包含我们自定义方法和其他涉及类型装换的方法都不能使用,不然会出现异常“不能将方法***转换为存储**”。原因是使用EF操作数据库时,EF是把我们的Linq(集合扩展)翻译成sql语句去数据库执行的,不能识别我们的自定义方法也很正常。

 

 语法:

1 var r2 = from t in test 
2 where t.Id>1 
3 select t

按条件选择:

var list3 = list.Where(p => p.Age > 5).Select(p => new { name = p.Name, age = p.Age } );
//var list3 = from p in list
// where p.Age > 5
// select new { 姓名 = p.Name,年龄=p.Age};

foreach (var person in list3)
{
Console.WriteLine(person);
}

 

排序:

var list3 = from p in list
orderby p.Age, p.Salary descending
select p;//先通过年龄默认的升序排序,年龄相同的话在通过工资降序排序
foreach (var person in list3)
{
Console.WriteLine(person);
}

 


分组:

var list3 = from p in list
group p by p.Age into g
select g;
foreach (var person1 in list3)
{
foreach (var person in person1)
{
Console.WriteLine(person);
}
}

 


表间连接:

var list1 = from d in dogs
join m in masters on d.MasterId equals m.Id//这里只能使用equals
select new { mastername = m.Name, dogname = d.Name };
foreach (var p1 in list1)
{
Console.WriteLine(p1);
}

 

注:

只有 Where,Select,OrderBy,GroupBy,Join 等这些能用 linq 写法,如果要用下面的 “ Max,Min,Count,Average,Sum,Any,First,FirstOrDefault,Single,SingleOrDefault,Distinct,Skip,Ta ke 等”则还要用 lambda 的写法(因为编译后是同一个东西,所以当然可以混用)。
var r1 = from p in list 
group p by p.Age into g
select new { Age = g.Key, MaxSalary = g.Max(p=>p.Salary), Count = g.Count() }; 
int c = r1.Count(); 
var c = (from p in list where p.Age>3 select p ).Count();

 

Linq语法