C# Linq到SQL将.Any()替换为.Contains()

C# Linq到SQL将.Any()替换为.Contains(),c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我有一本以人名为关键字的字典。每个值都是一个包含datetime的类的列表 我想从数据库中获取所有合同,其中列表中的每个日期都介于从-日期到-日期之间。每个人可能有多个 我不能使用.Any()函数。如果我这样做,我会得到这个错误:“除了Contains()操作符之外,不能在查询操作符的LINQ到SQL实现中使用局部序列。” 这是一个使用.Any方法的示例,该方法不适用于linq to sql。我需要另一种方法来处理这个问题 public class SimpleObject {

我有一本以人名为关键字的字典。每个值都是一个包含datetime的类的列表

我想从数据库中获取所有合同,其中列表中的每个日期都介于从-日期到-日期之间。每个人可能有多个

我不能使用.Any()函数。如果我这样做,我会得到这个错误:“除了Contains()操作符之外,不能在查询操作符的LINQ到SQL实现中使用局部序列。”

这是一个使用.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)));
        }
    }
公共类SimpleObject
{
公共布尔测试{get;set;}
公共日期时间日期时间{get;set;}
}
专用无效测试(字典数据库ObjDictionary)
{
使用(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>=x.UntilDate));
}
}

我认为应该这样做。看起来你依赖的是y,这两个y都是一样的。此外,您正在检查a是否大于截止日期和大于起始日期,因此我修复了这些

var selectedObj = db.Contracts.Where(x => dataBaseObjDictionary.ContainsKey(x.PersonRef) 
                && dataBaseObjDictionary.Values.Any(
                y => y.Any(a => x.FromDate <= a.DateTime 
                        && a.DateTime <=  x.UntilDate)
                       )
                );
var selectedObj=db.Contracts.Where(x=>dataBaseObjDictionary.ContainsKey(x.PersonRef)
&&dataBaseObjDictionary.Values.Any(

y=>y.Any(a=>x.FromDate我认为应该这样做。看起来您依赖于y与两个y.Any相同。此外,您正在检查a是否大于截止日期和起始日期,因此我修复了它们

var selectedObj = db.Contracts.Where(x => dataBaseObjDictionary.ContainsKey(x.PersonRef) 
                && dataBaseObjDictionary.Values.Any(
                y => y.Any(a => x.FromDate <= a.DateTime 
                        && a.DateTime <=  x.UntilDate)
                       )
                );
var selectedObj=db.Contracts.Where(x=>dataBaseObjDictionary.ContainsKey(x.PersonRef)
&&dataBaseObjDictionary.Values.Any(


y=>y.Any(a=>x.FromDate)我认为linq到sql不知道如何将方法ContainsKey转换为sql,尝试将dataBaseObjDictionary.ContainsKey(x.PersonRef)重写为dataBaseObjDictionary.Keys.Contains(x.PersonRef)。我甚至会更进一步,尝试使LINQ查询尽可能简单,以减少出错:
int[]keys=dataBaseObjDictionary.keys.ToArray();…其中(x=>keys.Contains(x.PersonRef)…
。我不知道这是否会有所不同,但我知道使用Entity Framework时,我看到它在运行时抱怨类似的事情,因此您必须保持LINQ的简单。对我的问题进行了编辑。问题是我不能使用.Any()方法。它给我带来了一个错误。我认为linq to sql不知道如何将方法ContainsKey转换为sql,请尝试将dataBaseObjDictionary.ContainsKey(x.PersonRef)重写为dataBaseObjDictionary.Keys.Contains(x.PersonRef)。我甚至会更进一步,尝试使LINQ查询尽可能简单,以减少出错:
int[]keys=dataBaseObjDictionary.keys.ToArray();…其中(x=>keys.Contains(x.PersonRef)…
。我不知道这是否会有所不同,但我知道使用Entity Framework时,我看到它在运行时抱怨类似的事情,因此您必须保持LINQ的简单。对我的问题进行了编辑。问题是我不能使用.Any()方法。它给我带来了一个错误。我认为linq to sql不知道如何将方法ContainsKey转换为sql,请尝试将dataBaseObjDictionary.ContainsKey(x.PersonRef)重写为dataBaseObjDictionary.Keys.Contains(x.PersonRef)。我甚至会更进一步,尝试使LINQ查询尽可能简单,以减少出错:
int[]keys=dataBaseObjDictionary.keys.ToArray();…其中(x=>keys.Contains(x.PersonRef)…
。我不知道这是否会有所不同,但我知道使用Entity Framework时,我看到它在运行时抱怨类似的事情,因此您必须保持LINQ的简单。对我的问题进行了编辑。问题是我不能使用.Any()方法。它给我带来了一个错误。但是我不能在对DB进行操作时使用任何函数。我得到了这个错误:“在查询运算符的LINQ到SQL实现中不能使用本地序列,除了Contains()运算符。”您可以使用.Count>0吗?而且该错误没有明确地将.Any命名为问题所在。很可能是ContainsKey。也尝试过,但不幸的是没有!相同的错误。我需要使用contains。我将使用更大的查询来生成另一个解决方案,而不是按日期筛选。但是,我无法使用。在对DB进行操作时使用任何函数。我收到此错误或者:“除了Contains()运算符外,查询运算符的LINQ到SQL实现中不能使用局部序列。”您可以使用.Count>0吗?而且该错误没有明确地将.Any命名为问题所在。很可能是ContainsKey。也尝试过,但不幸的是没有!相同的错误。我需要使用contains。我将使用更大的查询来生成另一个解决方案,而不是按日期筛选。但是,我无法使用。在对DB进行操作时使用任何函数。我收到此错误或者:“除了Contains()运算符外,查询运算符的LINQ到SQL实现中不能使用局部序列。”可以使用.Count>0吗?而且该错误没有显式地将.Any命名为问题所在。很可能是ContainsKey。也尝试了该操作,但不幸的是没有!相同的错误。我需要使用contains。我将使用更大的查询来生成另一个解决方案,而不是按日期筛选。