2011-12-05 77 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() 
}