创建一个linq子查询返回错误“本地序列不能用于查询运算符的LINQ to SQL实现,但Contains运算符除外”

时间:2011-01-16 05:27:49

标签: linq c#-4.0

我创建了一个返回所需数据的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();

我要做的是键入来自dictonary的值,其中key = itemTypeID

我收到此错误。

  

除了Contains运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现。

我需要修改什么?

1 个答案:

答案 0 :(得分:1)

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

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

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

2)在您的查询中使用:

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

3)在你做的时候取回你需要的对象,然后在第二步中填充ItemDescription。

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