【问题标题】:Create a linq subquery returns error "Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator"创建 linq 子查询返回错误“本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但包含运算符除外”
【发布时间】:2011-01-16 05:27:49
【问题描述】:

我创建了一个返回所需数据的 linq 查询,我现在有一个新要求,需要在返回的结果中添加一个额外的字段。我的实体包含一个 ID 字段,我试图将其映射到另一个表,但运气不佳。

这是我目前所拥有的。

            Dictionary<int, string> itemDescriptions = new Dictionary<int, string>();
            foreach (var item in ItemDetails)
            {
                itemDescriptions.Add(item.ItemID, item.ItemDescription);
            }
            DB.TestDatabase db = new DB.TestDatabase(Common.GetOSConnectionString());

            List<Transaction> transactionDetails = (from t db.Transactions
                                         where t.CardID == CardID.ToString()
                                         select new Transaction
                                         {
                                             ItemTypeID= t.ItemTypeID,
                                             TransactionAmount = t.TransactionAmount,
                                             ItemDescription = itemDescriptions.Select(r=>r.Key==itemTypeID).ToString()
                                         }).ToList();

我正在尝试做的是从 key = itemTypeID 的字典中键入值

我收到此错误。

本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Contains 运算符除外。

我需要修改什么?

【问题讨论】:

    标签: linq c#-4.0


    【解决方案1】:

    这是this question 的副本。您遇到的问题是因为您试图将内存中的集合(itemDescriptions)与数据库表匹配。由于 LINQ2SQL 的工作方式,它试图在数据库中执行此操作,这是不可能的。

    基本上有三个选项(除非我遗漏了什么)

    1) 重构您的查询,以便将一个简单的原始对象传递给查询,该对象可以传递给数据库(仅当 itemDescriptions 是一个小集合时才​​好)

    2) 在您的查询中使用:

    from t db.Transactions.ToList()
    ...
    

    3) 在执行过程中取回所需的对象,然后在第二步中填充 ItemDescription。

    请记住,第二个选项将强制 LINQ 评估查询并将所有事务返回到您的代码,然后在内存中对其进行操作。如果事务表很大,这不会很快!

    【讨论】:

      猜你喜欢
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多