【问题标题】:Linq2SQL "Local sequence cannot be used in LINQ to SQL" errorLinq2SQL“本地序列不能在 LINQ to SQL 中使用”错误
【发布时间】:2010-06-28 22:57:19
【问题描述】:

我有一段代码将内存列表与数据库中保存的一些数据结合起来。这在我的单元测试中工作得很好(使用使用 List 的模拟 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;
    }

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

异常信息:
异常类型: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;
    }

【问题讨论】:

    标签: linq linq-to-sql


    【解决方案1】:

    我猜这与事实有关 该 orderItems 在数据库中 而且releasedItems在内存中。

    您是对的,您不能使用 LINQ 将表连接到列表。

    看看这个链接:

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

    他建议使用 Contains() 方法,但您必须尝试一下它是否能满足您的需求。

    【讨论】:

    • 太好了,知道 linq2sql 无法将内存加入数据库数据,这几乎是我想出的解决方案
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您的单元测试之所以有效,是因为您将内存列表与内存列表进行比较。

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

      【讨论】:

      • 你看我的代码了吗?!这几乎就是我所做的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多