2011-12-05 51 views
4

我有一个名为Entities的实体集,它具有字段Name和字段Version。我希望返回具有所选Name的最高版本的对象。实体框架 - 从ID =(从实体中选择最大(Id))的实体中选择*

SQL明智我会去

Select * 
from table 
where name = 'name' and version = (select max(version) 
            from table 
            where name = 'name') 

或类似的东西。不知道如何用EF实现这一点。我试图用CreateQuery<>与查询的文本表示,如果有帮助。

感谢

编辑: 下面是使用两个查询工作版本。不是我想要的,似乎效率很低。

var container = new TheModelContainer(); 
var query = container.CreateQuery<SimpleEntity>(
    "SELECT VALUE i FROM SimpleEntities AS i WHERE i.Name = 'Test' ORDER BY i.Version desc"); 
var entity = query.Execute(MergeOption.OverwriteChanges).FirstOrDefault(); 
query = 
    container.CreateQuery<SimpleEntity>(
     "SELECT VALUE i FROM SimpleEntities AS i WHERE i.Name = 'Test' AND i.Version =" + entity.Version); 
var entity2 = query.Execute(MergeOption.OverwriteChanges); 
Console.WriteLine(entity2.GetType().ToString()); 

回答

7

你能试试这样的事吗?

using(var container = new TheModelContainer()) 
{ 
    string maxEntityName = container.Entities.Max(e => e.Name); 
    Entity maxEntity = container.Entities 
          .Where(e => e.Name == maxEntityName) 
          .FirstOrDefault(); 
} 

这将选择先设定为EntitiesName最大值,然后从匹配的名称实体集抢实体。

+0

简单。谢谢:) – Ian

1

我觉得这样的东西..?

 var maxVersion = (from t in table 
         where t.name == "name" 
         orderby t.version descending 
         select t.version).FirstOrDefault(); 

     var star = from t in table 
        where t.name == "name" && 
        t.version == maxVersion 
        select t; 

或者,就像一个声明:

 var star = from t in table 
        let maxVersion = (
        from v in table 
        where v.name == "name" 
        orderby v.version descending 
        select v.version).FirstOrDefault() 
        where t.name == "name" && t.version == maxVersion 
        select t; 
+0

有趣的看到每个答案使用不同的符号。我更喜欢这种类型的符号,但实际上更多地使用点符号,因为它似乎适合我狡猾的内存。谢谢。 – Ian

2

这是为了获得最大的

using (MyDBEntities db = new MyDBEntities()) 
{ 
    var maxReservationID = _db .LD_Customer.Select(r => r.CustomerID).Max(); 
} 
2

我想从一个简单点的最简单的方法,这应该是相同的结果,但由于不需要通过EF到SQL Server的两次往返,所以您总是希望尽可能少地执行查询以减少延迟,因为Id字段是主键并编入索引,因此应该是高性能的

using(var db = new DataContext()) 
{ 
var maxEntity = db.Entities.OrderByDecending(x=>x.Id).FirstOrDefault() 
} 

应该是等价的SQL查询

SELECT TOP 1 * FROM Entities Order By id desc 

,从而包括搜索项

string predicate = "name"; 

using(var db = new DataContext()) 
{ 
var maxEntity = db.Entities 
.Where(x=>x.Name == predicate) 
.OrderByDecending(x=>x.Id) 
.FirstOrDefault() 
}