Linq2SQL“本地序列不能在LINQ to SQL中使用”错误

时间:2010-06-28 13:59:20

标签: linq linq-to-sql

我有一段代码,它将内存列表与数据库中保存的一些数据相结合。这在我的单元测试中运行得很好(使用模拟的Linq2SqlRepository使用List)。

    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;
    }

我遇到一个错误,当我针对数据库运行它时,我真的不明白。

  

例外信息:
  异常类型:System.NotSupportedException
  异常消息:本地序列不能在LINQ to 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;
    }

3 个答案:

答案 0 :(得分:15)

  

我猜这与事实有关   orderItems在数据库上   和releasedItems在内存中。

你是对的,你不能使用LINQ将表连接到List。

看一下这个链接:

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

他建议使用Contains()方法,但你必须使用它来查看它是否适合你的需要。

答案 1 :(得分:2)

看起来您需要首先制定db查询,因为它无法为内存中的对象创建表达式树的正确SQL表示形式。它可能属于连接,所以是否可以从内存查询中获取可用作简单原语的值?例如,使用Contains()作为错误建议。

答案 2 :(得分:2)

您将单元测试工作,因为您将内存列表与内存列表进行比较。

对于内存列表到数据库,您将需要使用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;
}