我有一段代码,它将内存列表与数据库中保存的一些数据相结合。这在我的单元测试中运行得很好(使用模拟的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;
}
答案 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;
}