Linq2SQL “Локальная последовательность не может привыкнуть в LINQ к SQL” ошибка

У меня есть часть кода, который комбинирует список в оперативной памяти с некоторыми данными, сохраненными в базе данных. Это работает просто великолепно в моих модульных тестах (использующий дразнивший 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;
    }
8
задан Antony Scott 28 June 2010 в 14:57
поделиться

3 ответа

Думаю, дело в том, что этот orderItems находится в базе данных и ReleaseItems находится в памяти.

Вы правы, вы не можете присоединить таблицу к списку с помощью LINQ.

Взгляните на эту ссылку:

http://flatlinerdoa.spaces.live.com/Blog/cns!17124D03A9A052B0!455.entry

Он предлагает использовать метод Contains (), но у вас будет поэкспериментировать с ним, чтобы увидеть, подойдет ли он для ваших нужд.

15
ответ дан 5 December 2019 в 08:50
поделиться

Похоже, вам сначала нужно сформулировать запрос к базе данных, потому что он не может создать правильное SQL-представление дерева выражения для объектов, находящихся в памяти. Это может быть связано с объединением, поэтому можно ли получить значение из запроса в памяти, которое можно использовать как простой примитив? Например, используя Contains () , как подсказывает ошибка.

2
ответ дан 5 December 2019 в 08:50
поделиться

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

Для списка памяти в базе данных вам нужно будет либо использовать 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;
}
2
ответ дан 5 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: