2016-12-27 19 views
11

私は、LINQのカスタム拡張メソッドがあります。方法:LINQカスタム拡張メソッドで使用非同期メソッド

public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> items, Func<T, TKey> property) 
{ 
    return items.GroupBy(property).Select(x => x.First()); 
} 

をそして私はこのようにそれを使用しています:

var spc = context.pcs.DistinctBy(w => w.province).Select(w => new 
      { 
       abc = w 
      }).ToList(); 

しかし、問題は、私ドンでありますToList()To want()このようなものが必要です。

var spc = await context.pcs.DistinctBy(w => w.province).Select(w => new 
      { 
       abc = w 
      }).ToListAsync(); 

Asyncを使用します。しかし、asyncは見つかりません。どうすれば私のカスタムメソッドをdistinctByにすることができますので、私は非同期に使うこともできますか?

+0

は、戻り値の型と引数のアイテムの両方のための代わりに '' IEnumerable'のIQueryable'使用を試みているために、あなたをお持ちですか?を参照してください。 'ToListAsync'はEFの' IQueryable'の拡張メソッドです:https://msdn.microsoft.com/en-us/library/dn220262%28v=vs.113%29.aspx?f=255&MSPPError= -2147217396 – Hypnobrew

答えて

17

ToListAsync()拡張メソッドはIQueryable<T>を拡張しているが、あなたのDistinctBy()方法はIEnumerable<T>を拡張(および返却)されます。

明らかに、ではLinq-To-Objects(メモリ内)を使用し、潜在的にブロックする(I/Oは関係しない)ため、ToListAsync()は利用できません。私も順番にExpression<Func<>>Func<>からpropertyパラメータを変更し

public static IQueryable<T> DistinctBy<T, TKey>(this IQueryable<T> items, Expression<Func<T, TKey>> property) 
{ 
    return items.GroupBy(property).Select(x => x.First()); 
} 

お知らせがQueryable.GroupByに一致するように(とEnumerable.GroupByを避ける):

代わりにこれを試してみてください。

MSDN

+1

明確にするために、複数のデータベースクエリを避けるために 'IEnumerable'の代わりに' IQueryable'を可能な限り使用することがベストプラクティスです。 :) – Hypnobrew

+0

@ Hypnobrew、それはいつも真実ではありません。通常は、事前に必要なデータをすべて明示的に取得し、 'IEnumerable 'として返します。 'IQueryable 'を返すのはエラーが起こりやすく、漏れ抽象と見なされることもあります。 – haim770

+1

はい、あなたは正しいです。 'IQueryable'フローをクラス間で、さらに悪い場合はレイヤ間で、漏れた抽象化が潜在的に起こる可能性があります。上記の例では、IQuerableが適切な場所で、クエリをできるだけ延期したいと考えている孤立した場所のように見えます。 – Hypnobrew