2011-12-05 36 views
4

フィールドNameとフィールドVersionを持つEntitiesというエンティティセットがあります。私は選択されたNameのための最高のバージョンを持つオブジェクトを返すしたいと思います。エンティティフレームワーク - 選択したエンティティからIDを選択します。

SQL賢明な私は、同様の

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

か何かに行くと思います。 EFでそれを達成する方法がわかりません。私はCreateQuery<>を使用して、それが役に立ちそうならクエリのテキスト表現を使用しようとしています。

おかげ

EDIT: はここに2つのクエリを使用して作業バージョンです。私が望むものではなく、非常に非効率的なようです。

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

このようなものを試すことができますか?最初に設定EntitiesからNameの最大値を選択し、名前と一致するエンティティセットからエンティティをつかむことになる

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

+0

シンプルが含まれるように

SELECT TOP 1 * FROM Entities Order By id desc 

SQLクエリの同等である必要があります。ありがとう:) – 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; 

あるいは、1文として:

 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

を取得する最も簡単な方法である私は、ビューの簡素化の観点から、これは同じ結果であるべきだと思いますが、 SQLサーバーへのEF経由の2回の往復を必要としないため、Idフィールドが主キーでインデックスに登録されているため、実行時間はできるだけ少ない回数でクエリを実行したい場合は、

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

ので、検索用語

string predicate = "name"; 

using(var db = new DataContext()) 
{ 
var maxEntity = db.Entities 
.Where(x=>x.Name == predicate) 
.OrderByDecending(x=>x.Id) 
.FirstOrDefault() 
} 
関連する問題