2011-01-16 9 views
1

必要なデータを返すlinqクエリを作成しました。返された結果に余分なフィールド。私のエンティティには、多くの運がなければ別のテーブルに対してマップしようとしているIDフィールドが含まれています。linqサブクエリを作成するとエラーが返される "Contains演算子以外のクエリ演算子のLINQ to SQL実装でローカルシーケンスを使用できない"

これはこれまで私が行ってきたことです。私がやろうとしています何

  Dictionary<int, string> itemDescriptions = new Dictionary<int, string>(); 
      foreach (var item in ItemDetails) 
      { 
       itemDescriptions.Add(item.ItemID, item.ItemDescription); 
      } 
      DB.TestDatabase db = new DB.TestDatabase(Common.GetOSConnectionString()); 

      List<Transaction> transactionDetails = (from t db.Transactions 
             where t.CardID == CardID.ToString() 
             select new Transaction 
             { 
              ItemTypeID= t.ItemTypeID, 
              TransactionAmount = t.TransactionAmount, 
              ItemDescription = itemDescriptions.Select(r=>r.Key==itemTypeID).ToString() 
             }).ToList(); 

は、キー=が、私はこのエラーを取得しています

をitemTypeID dictonaryからキー値です。

LINQからSQLへのContains演算子以外のクエリの実装では、ローカルシーケンスを使用できません。

変更する必要はありますか?

答えて

1

これはthis questionの複製です。問題は、メモリ内のコレクション(itemDescriptions)をDBテーブルと照合しようとしているためです。 LINQ2SQLが動作する方法のために、これはDBでこれを行うことはできません。

1)あなたはitemDescriptionsがある場合にのみ、良いDB(にaccross渡すことができるクエリに簡単なプリミティブオブジェクトを渡すように、クエリをリファクタリング(私は何かが欠けていない限り)

は、基本的に3つのオプションがあります。クエリの使用では小さなセット)

2):

from t db.Transactions.ToList() 
... 

3)第二段階でItemDescriptionを移入そして、あなたがやっているよう必要なオブジェクトを取り戻します。

2番目のオプションは、LINQにクエリを評価させ、すべてのトランザクションをコードに戻してメモリ上で操作させることに注意してください。トランザクションテーブルが大きい場合、これは迅速ではありません!

関連する問題