【发布时间】:2015-06-09 15:18:39
【问题描述】:
有一本以个人 ID 作为键的字典。每个值都是一个 List,其中包含一个包含日期时间的类。
我想从数据库中获取所有合同,其中列表中的每个日期都在合同从 - 日期开始到截止日期之间。每个人可能有多个。
我不能使用 .Any() 函数。如果我这样做,我会收到此错误:“本地序列不能用于查询运算符的 LINQ to SQL 实现中,但 Contains() 运算符除外。”
这是一个使用 .Any 方法的示例,该方法不适用于 linq to sql。我需要另一种方法来管理它。
public class SimpleObject
{
public bool Test { get; set; }
public DateTime DateTime { get; set; }
}
private void Test(Dictionary<int, List<SimpleObject>> dataBaseObjDictionary)
{
using (var db = TpContext.Create())
{
var selectedObj = db.Contracts.Where(x => dataBaseObjDictionary.ContainsKey(x.PersonRef) && dataBaseObjDictionary.Values.Any(y => y.Any(a => x.FromDate <= a.DateTime) && y.Any(a=>a.DateTime >= x.UntilDate)));
}
}
【问题讨论】:
-
我认为 linq to sql 不知道如何将方法 ContainsKey 转换为 SQL,尝试将 dataBaseObjDictionary.ContainsKey(x.PersonRef) 重写为 dataBaseObjDictionary.Keys.Contains(x.PersonRef)。
-
我什至会更进一步,并尝试使 LINQ 查询尽可能简单,以减少出错的可能性:
int[] keys = dataBaseObjDictionary.Keys.ToArray(); ... .Where(x => keys.Contains(x.PersonRef)...。我不知道它是否会有所作为,但我知道 Entity Framework,我已经看到它在运行时抱怨类似的事情,所以你必须保持 LINQ 简单。 -
对我的问题进行了编辑。问题是我不能使用 .Any() 方法。它给我一个错误。
标签: c# linq linq-to-sql