我有一个名为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());
答案 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;