2017-08-21 10 views
-1

EFでは、インデックスを処理する必要がある場合、エンティティコレクションをリストに変換する必要があります。IQueryableまたはIEnumerableはインデクサを実装しません(遅延実行メカニズムのため意味がありません)。インデックスを使用するためにかなり大きなコレクションをToListで使用すると、重いものになります。行番号によるエンティティ検索

これは、時には行番号(ID /プライマリキーではない)でエンティティを検索する必要がある理由です。たとえば、レコードが1つあり、行番号(ソートされたテーブルの位置)を取得して、次のレコードを取得したいとします。

これはEntity Frameworkで実現できますか?私はこれを行うためにSQLクエリを送信することができますが、LinqishとEF固有のアプローチがあれば興味があります。

+0

あなたは 'ElementAt()'メソッドとこのリンクを試してみましたか:https://stackoverflow.com/questions/2471588/how-to-get-index-using-linq? –

+0

@ Tim.Tang:それは話題の方法です。 – Arrrr

+0

大きなリストがあり、行番号で検索する必要がある場合は、クエリでSkip/Takeを使用することを検討してください。 – Smit

答えて

0

これは、DbContexを調整し、行番号に対応する偽のエンティティを追加することで可能です。このエンティティは、組み込みのROW_NUMBER()関数をSQLで使用するために利用することができます。例えば:・高性能の

var rowNumber = dbContext.Set<RowNumber>().FromSql("SELECT Row_Number FROM (SELECT ROW_NUMBER() OVER(ORDER BY [Column] DESC) AS Row_Number, [Column] FROM [Table]) AS Query WHERE [Column] = {0}").ToList(); 

そして、ええ、これは、より効率的である:

public class RowNumber{ 
    public Int64 Row_Number {get; set;} 
} 

は、今、私たちは次のクエリを作ることができ、これらの2 DbContext

public virtual DbSet<RowNumber> RowNumber {get; set;} 

protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<RowNumber>(x => { 
      x.HasKey(e => e.Row_Number); 
     }); 
... 
} 

を追加することによって、続い!

関連する問題