5

Id のコレクションに基づいてクエリ可能なオブジェクト (IQueryable) をフィルター処理する拡張メソッドがあります。

IQueryable は、LinqToSql リクエストを介してデータベースから供給されることに注意してください

 public static IQueryable<NewsItemSummary> WithID(this IQueryable<NewsItemSummary> qry, IQueryable<Guid> Ids)
    {
        return from newsItemSummary in qry
               where Ids.Contains(newsItemSummary.ID)
               select newsItemSummary;
    }

Idが配列またはリストから作成され、クエリ可能なリストとして渡された場合、機能しません

例えば...

 GetNewsItemSummary().WithID(ids.AsQueryable<Guid>())

Idsが LinqToSql リクエストから構成されている場合、機能します!!

これは既知の問題です: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=355026

私の Ids コレクションは LinqToSql リクエストから取得できません...

IQueryableではなくIListを消費するように関数を変更すると、注意してください....

 public static IQueryable<NewsItemSummary> WithID(this IQueryable<NewsItemSummary> qry, IList<Guid> Ids)
    {
        return from newsItemSummary in qry
               where Ids.Contains(newsItemSummary.ID)
               select newsItemSummary;
    }

次の例外が発生します。

Method 'Boolean Contains(System.Guid)' has no supported translation to SQL.

だから...私がしたいのは、ガイドのリストまたは配列に基づいてニュースのコレクションをフィルタリングすることだけです....アイデア???

4

1 に答える 1

11

これで翻訳されます。

public static IQueryable<NewsItemSummary> WithID(
    this IQueryable<NewsItemSummary> qry,
    List<Guid> Ids
)
    {
        return from newsItemSummary in qry
               where Ids.Contains(newsItemSummary.ID)
               select newsItemSummary;
    }
)

ローカル コレクションに対する Contains メソッドの変換は、.net 3.5 の linq から sql への開発で追加された最後の機能の 1 つでしたIList<T>

また、LinqToSql は膨大な数の項目を含むリストを喜んで変換しますが (50,000 を超える要素を処理するのを見てきました)、SQL Server は 1 つのクエリに対して 2,100 個のパラメーターしか受け入れないことに注意してください。

于 2009-06-07T14:38:20.807 に答える