У меня есть часть кода, который комбинирует список в оперативной памяти с некоторыми данными, сохраненными в базе данных. Это работает просто великолепно в моих модульных тестах (использующий дразнивший Linq2SqlRepository, который использует Список).
public IRepository<OrderItem> orderItems { get; set; }
private List<OrderHeld> _releasedOrders = null;
private List<OrderHeld> releasedOrders
{
get
{
if (_releasedOrders == null)
{
_releasedOrders = new List<nOrderHeld>();
}
return _releasedOrders;
}
}
.....
public int GetReleasedCount(OrderItem orderItem)
{
int? total =
(
from item in orderItems.All
join releasedOrder in releasedOrders
on item.OrderID equals releasedOrder.OrderID
where item.ProductID == orderItem.ProductID
select new
{
item.Quantity,
}
).Sum(x => (int?)x.Quantity);
return total.HasValue ? total.Value : 0;
}
Я получаю ошибку, которую я действительно не понимаю, когда я выполняю ее против базы данных.
Информация об исключении:
Тип исключительной ситуации: Система. NotSupportedException
Сообщение об исключении: Локальная последовательность не может привыкнуть в LINQ к реализации SQL операторов запроса кроме оператора Contains ().
Что я делаю неправильно?
Я предполагаю, что это относится к тому, что orderItems находится на базе данных, и releasedItems находится в памяти.
Я изменился, мой код на основе данных ответов (благодарит все),
public int GetReleasedCount(OrderItem orderItem)
{
var releasedOrderIDs = releasedOrders.Select(x => x.OrderID);
int? total =
(
from item in orderItems.All
where releasedOrderIDs.Contains(item.OrderID)
&& item.ProductID == orderItem.ProductID
select new
{
item.Quantity,
}
).Sum(x => (int?)x.Quantity);
return total.HasValue ? total.Value : 0;
}
Думаю, дело в том, что этот orderItems находится в базе данных и ReleaseItems находится в памяти.
Вы правы, вы не можете присоединить таблицу к списку с помощью LINQ.
Взгляните на эту ссылку:
http://flatlinerdoa.spaces.live.com/Blog/cns!17124D03A9A052B0!455.entry
Он предлагает использовать метод Contains (), но у вас будет поэкспериментировать с ним, чтобы увидеть, подойдет ли он для ваших нужд.
Похоже, вам сначала нужно сформулировать запрос к базе данных, потому что он не может создать правильное SQL-представление дерева выражения для объектов, находящихся в памяти. Это может быть связано с объединением, поэтому можно ли получить значение из запроса в памяти, которое можно использовать как простой примитив? Например, используя Contains ()
, как подсказывает ошибка.
Модульные тесты работают, потому что ваше сравнение списка памяти со списком памяти.
Для списка памяти в базе данных вам нужно будет либо использовать memoryVariable.Contains (...), либо сначала вызвать db и вернуть list (), чтобы вы могли сравнить список памяти со списком памяти, как и раньше. Второй вариант вернет слишком много данных, поэтому вы вынуждены отказаться от маршрута Contains ().
public int GetReleasedCount(OrderItem orderItem)
{
int? total =
(
from item in orderItems.All
where item.ProductID == orderItem.ProductID
&& releasedOrders.Contains(item.OrderID)
select new
{
item.Quantity,
}
).Sum(x => (int?)x.Quantity);
return total.HasValue ? total.Value : 0;
}