3

それぞれ1対多の関係を持つ2つのテーブル(TABLE1、TABLE2-一意です)と、両方のテーブルのID列間の外部キーがあります。

linq2sqlを使用して、すべてのTABLE1エントリを選択しようとしています。これにより、対応するTABLE2値に、渡すリストに少なくとも1つの項目が含まれるようになります。

これは、 LINQPad (すばらしいプログラム)でテストするために使用していたサンプルコードですが、エラーNotSupportedException:クエリ演算子「Any」に使用されるサポートされていないオーバーロードが発生します。

long[] items = { 3, 5, 8 };
var predicate = PredicateBuilder.False<TABLE2>();

foreach (long i in items)
{
    long t = i;
    predicate = predicate.Or(att => att.ID == t);
}

//TABLE2.Where(predicate).Dump(); //works like a charm

IQueryable query = 
    from t1 in TABLE1
    where t1.TABLE2.AsQueryable().Any(predicate) //problem with this line
    select a;

query.Dump();

アップデート

LinqPadでLinqKitを使用する場合は、LinqKit.dllへの参照を追加し、[PredicateBuilderを含める]をオフにしてから、[追加の名前空間のインポート]タブでLinqKitを追加します。

4

1 に答える 1

2

回避策は

  1. TABLE1 オブジェクトに対してAsExpandable()を呼び出します
  2. EntitySetで使用する場合は、式変数でCompile()を呼び出します。

したがって、最終的なクエリは

IQueryable query = 
    from t1 in TABLE1.AsExpandable()
    where t1.TABLE2.Any(predicate.Compile()) //the problem should disappear
    select a;

詳細はこちら

于 2010-04-22T12:12:27.200 に答える