代码之家  ›  专栏  ›  技术社区  ›  Antony Scott

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

  •  8
  • Antony Scott  · 技术社区  · 14 年前

    我有一段代码,它将内存中的列表与数据库中的一些数据相结合。这在我的单元测试中运行得很好(使用一个模拟的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中使用本地序列 查询运算符的实现

    我做错什么了?

    订单项 在数据库中 释放物 在记忆中。


    编辑

    我已经根据给出的答案修改了代码(谢谢大家)

        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 回复  |  直到 14 年前
        1
  •  15
  •   Abe Miessler    14 年前

    我猜这和事实有关 释放者在记忆中。

    是的,不能使用LINQ将表联接到列表。

    看看这个链接:

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

    他建议使用Contains()方法,但您必须仔细研究它,看看它是否能满足您的需要。

        2
  •  2
  •   Neil Barnwell    14 年前

    Contains() 正如错误所暗示的那样。

        3
  •  2
  •   Simon Hughes    14 年前

    单元测试之所以有效,是因为您需要比较内存列表和内存列表。

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