分类

链接

2012 年 1 月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > .NET > 正文
共享办公室出租
Linq Max函数用法
.NET 暂无评论 阅读(8,986)

今天试着从Entity FrameWork 的DbSet中查询出ID最大的那一条记录,用原生的select语句该这样写:

  1. select * from Trip.dbo.Test  
  2. where SID=(select MAX(SID) from Trip.dbo.Test)  

可是用Linq该怎样写呢?我们可以试着按原生的select语句来写,如:

  1. TripEntities te = new TripEntities();  
  2. DbSet<Test> testSet = te.Set<Test>();  
  3. var a = testSet.Where(t => t.SID == testSet.Max(tt => tt.SID));  

或者

  1. var a = from test in testSet  
  2.           where test.SID==testSet.Max(t=>t.SID)  
  3.           select test;  

编译可以通过,不过运行时会报这样一个错误

类型“System.Data.Objects.ObjectQuery`1[ConsoleApplication1.Test]”的对象无法转换为类型“System.Data.Entity.DbSet`1[ConsoleApplication1.Test]”。

不过不涉及数据库的查询,直接用以上Linq查询均可以。如:

  1. List<int> query=new List<int>();  
  2. … …  
  3. var ids1 = from q in query  
  4.            where q.ID==query.Max(qu=>qu.ID)  
  5.            select q;<span style="font-family:宋体;">  
  6. </span>  

看来针对涉及到数据库的此类查询,把DbSet写在where和select块里是不正确的,那么该怎样写呢?

  1. int maxId = (from test in testSet  
  2.                group test by 1 into tt  
  3.                 select tt.Max(t => t.SID)).FirstOrDefault();  
  4. var d = from test in testSet  
  5.           where test.SID == maxId  
  6.            select test;  

这里group test by 1,如果写成by test.SID,则同样会有上面的错误。写成by 1才能通过,第一句查询出来是最大的ID,第二句则查出来的是整条记录。

问题来了:

1.为什么涉及到数据库的时候同样的where q.ID==query.Max(qu=>qu.ID)会出错,而平常数据不会;

2. 为什么用group * by 1 后可以查询

这些问题,到底为何,还请高手指出原因。

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:Linq Max函数用法 | Bruce's Blog

发表评论

留言无头像?