2016-08-31 12 views
1

サプライヤテーブルがサプライヤオブジェクトで満たされていますが、ここでサプライヤIDはプライマリキーです。私はこれらのサプライヤーから提供されるすべての製品を見つける必要があります。多対多の関係があるため、SupplierProductsの間には、サプライヤIDとプロダクトIDが複合プライマリキーとして使用されているブリッジテーブルがあります。ラムダ式 - IEnumerable <Object>からwhere句に値を提供する方法

ラムダ関数を使用して特定のサプライヤのIEnumerable<SupplierProducts>を取得しました。今、商品表を照会して、IEnumerable<SupplierProducts>にあるすべての商品を検索したいと思います。私はforeach()を使ってproductsテーブルにデータを入れるのではなく、ラムダ式のような 'in'を使いたいと思います。

これは以前の回答だったはずですが、残念なことに15分間試した後、私は明確な解決策を見つけることができませんでした。私はとany()の機能を調べました。ここに私のコードは次のとおりです。

IEnumerable<SupplierProducts> supplierProducts = db.SupplierProducts.Where(w => w.SupplierID == supplierID).ToList(); 
IEnumerable<Products> products = db.Products.Where(w => w.ProductID.contains(supplierProducts.productID)).ToList(); 
+0

たとえば、 'db.Products.Where(w => supplierProducts.productID.Contains(w.ProductID))のように' w.ProductID'と 'supplierProcducts.productID'を入れ替えてみることができます。 ' –

+0

@ KeyurPATEL supplierProductsはIEnumerableであり、First()メソッドまたは類似のメソッドを使用しない限り、productIDに直接アクセスできません。 – SJaka

答えて

6

あなたはかなり接近している:あなたがする必要があるすべては、IDを選択してから、このようなContainsを、使用している:

var supplierProductIds = db.SupplierProducts 
    .Where(w => w.SupplierID == supplierID) 
    .Select(p => p.productID) 
    .ToList(); // You could get better performance without ToList 
IEnumerable<Products> products = db.Products 
    .Where(w => supplierProductIds.Contains(w.ProductID)) 
    .ToList(); 
+0

ご連絡ありがとうございます。私はこれを試しましたが、エラーが出ます。 '' System.Collections.Generic.IEnumerable 'には' Contains 'の定義が含まれておらず、最適な拡張メソッドがSystem.Linqをオーバーロードしています。 (System.Linq.ParallelQuery 、TSource)に '無効な引数があります'というメッセージが表示されます。 – SJaka

+1

@SJakaこれは、あなたが 'Select()'を追加する前のことですね。 – dasblinkenlight

+1

@dasblinkenlight、最初の割り当てをリストに変換するのはなぜですか?それを残す 'IQueryable <>' –

0

あなたが正しくあなたのモデルを構築している場合は、必要がありますサプライヤークラス

public virtual ICollection<Product> Products {get; set;} 

に製品の仮想プロパティを持っており、これは簡単にあなたの仕事をしているだろう:

を10
db.Suppliers.Where(s => s.Id == supplierID).Select(s => s.Products) 
関連する問題