Linq. Выберите метод вопроса, используя LinqPad - PullRequest
2 голосов
/ 11 марта 2011

У меня проблемы с пониманием, почему я получаю ошибку в следующем коде. Я уверен, что упускаю что-то простое, но мне нужна помощь в понимании.

Я выполняю этот код в LinqPad, используя LinqToSql.

У меня есть следующий код в LinqPad:

Используются три таблицы: отгрузки, детали отгрузки и веса отгрузки. Все три таблицы связаны идентификатором shipmentID, который является PK таблицы отгрузок.

В этом коде последний запрос («Веса») завершается с ошибкой: «Не поддерживается Исключение: запросы с локальными коллекциями не поддерживаются». Я понимаю, что что-то в LinqToSql не поддерживает использование .Contains, но я не понимаю, как работает запрос под названием «Details». Похоже, такой же запрос для меня. Может ли кто-нибудь заполнить пробелы для меня?

Для тех, кто не знаком с 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");

Ответы [ 2 ]

2 голосов
/ 11 марта 2011

Ваши списки принадлежат 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");
0 голосов
/ 11 марта 2011

Да, как указано, вам придется сделать

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");
...