我已阅读了大量有关“可能的多个枚举”问题的帖子。我想我理解延迟与立即执行的概念,以及返回接口与具体类型的含义。使用Linq2Sql上下文强制立即执行IEnumerable查询
因此,考虑到下面的数据访问层方法和测试代码,我试图强制立即执行查询。 ToList()
适用于数据访问层方法,但不适用于Main方法(可能因为在处理上下文后调用ToList()
)。铸造as ReadOnlyCollection<Item>
(或IReadOnlyCollection
)也不起作用。
static void Main(string[] args)
{
var foo = GetItems(i => i.SupiCode.Contains("TestCode")).ToList(); // ObjectDisposedException (context)
}
private static IEnumerable<Item> GetItems(Func<Item, bool> filter)
{
using (var ctx = new RRPClassesDataContext())
{
return ctx.Item.Where(filter); //.ToList(); <-- this works
}
}
我的目标是防止多个枚举(即多个数据库访问)。从我阅读的内容来看,我不应该修改DAL以适应客户的需求。相反,客户应正确处理退回的IEnumerable
。所以我的问题是:
- 在这种情况下,客户可以强制立即执行(如果是的话)?
- 如果DAL返回
.ToList()
和/或签名被修改?