2

次のコードでエラーが発生する理由がわかりません。簡単なものが欠けていると確信していますが、理解するのに助けが必要です。

LinqToSql を使用して、LinqPad でこのコードを実行しています。

LinqPad に次のコードがあります。

関連する 3 つのテーブルがあります: Shipments、ShipmentDetails、および ShipmentWeights。3 つのテーブルはすべて、Shipments テーブルの PK である shippingID によってリンクされています。

このコードでは、最後のクエリ ("Weights") が次のエラーで失敗します:「サポートされていない例外: ローカル コレクションを含むクエリはサポートされていません。」LinqToSql の何かが .Contains の使用をサポートしていないことがわかりましたが、「詳細」というクエリがどのように機能しているかわかりません。私には同じ種類のクエリのようです。誰かが私のためにギャップを埋めることができますか?

LinqPad に慣れていない方のために説明すると、.Dump メソッドは、フォーマットされた形式で内容を出力する IQueryable の単なる拡張メソッドです。

var shipments = Shipments.Where(s => s.OrderID == "Some OrderID");
shipments.Dump("Shipments");

var shipmentIds = shipments.Select(s => s.ShipmentID);
shipmentIds.Dump();

    //This query works.  What is different about this query than the one that fails?
var shipmentDetails = ShipmentDetails.Where(d => shipmentIds.Contains(d.ShipmentID));
shipmentDetails.Dump("Details");

var detailShipmentIds = shipmentDetails.Select(sd => sd.ShipmentID);
detailShipmentIds.Dump();

//This is the query that generates the error
    var shipmentWeights = ShipmentWeights.Where(w => detailShipmentIds.Contains(w.ShipmentID));
shipmentWeights.Dump("Weights");
4

2 に答える 2

2

リストは iQueryable です。つまり、クエリはまだ実行されていないため、Containsクエリの一部として使用することはできません。最初にそれらをローカルリストに変更するだけで、これが機能します。例えば

var shipmentIds = shipments.Select(s => s.ShipmentID).ToList();

すべてのローカル リストに対して同じことを行います。

ここに完全なリストがあります

var shipments = Shipments.Where(s => s.OrderID == "Some OrderID");
shipments.Dump("Shipments");

var shipmentIds = shipments.Select(s => s.ShipmentID).ToList();
shipmentIds.Dump();

//This query works.  What is different about this query than the one that fails?
var shipmentDetails = ShipmentDetails.Where(d => shipmentIds.Contains(d.ShipmentID));
shipmentDetails.Dump("Details");

var detailShipmentIds = shipmentDetails.Select(sd => sd.ShipmentID).ToList();
detailShipmentIds.Dump();

//This is the query that generates the error
var shipmentWeights = ShipmentWeights.Where(w => detailShipmentIds.Contains(w.ShipmentID));
shipmentWeights.Dump("Weights");
于 2011-03-11T20:09:13.280 に答える
0

ええ、指摘したように、あなたはしなければならないでしょう

var shipments = Shipments.Where(s => s.OrderID == "Some OrderID");
shipments.Dump("Shipments");

var shipmentIds = shipments.Select(s => s.ShipmentID).ToList();
shipmentIds.Dump();

    //This query works.  What is different about this query than the one that fails?
var shipmentDetails = ShipmentDetails.Where(d => shipmentIds.Contains(d.ShipmentID));
shipmentDetails.Dump("Details");

var detailShipmentIds = shipmentDetails.Select(sd => sd.ShipmentID).ToList();
detailShipmentIds.Dump();

//This is the query that generates the error
    var shipmentWeights = ShipmentWeights.Where(w => detailShipmentIds.Contains(w.ShipmentID));
shipmentWeights.Dump("Weights");
于 2011-03-11T20:09:27.990 に答える