实体框架 - 从实体中选择*,其中Id =(从实体中选择最大值(Id))

时间:2011-12-05 13:04:21

标签: entity-framework

我有一个名为Entities的实体集,其中包含字段Name和字段Version。我希望返回具有所选Name的最高版本的对象。

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());

4 个答案:

答案 0 :(得分:7)

你能尝试这样的事吗?

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

这将首先从Name集中选择Entities的最大值,然后从实体集中获取与该名称匹配的实体。

答案 1 :(得分:2)

这是获得最大

的最简单方法
using (MyDBEntities db = new MyDBEntities())
{
   var maxReservationID = _db .LD_Customer.Select(r => r.CustomerID).Max();
}

答案 2 :(得分: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()
}

答案 3 :(得分: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;