2015-06-09 39 views
1

以人员ID为关键字获取了一本字典。每个值都是一个List,其中包含一个包含日期时间的类。Linq to SQL使用.Contains()替换.Any()

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

我不能使用.Any()函数。如果我这样做,我会得到这样的错误:“除了Contains()运算符,本地序列不能用于查询运算符的LINQ to SQL实现。”

这是一个与.nny方法不能用于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))); 
     } 
    } 
+0

我认为,LINQ to SQL的不知道怎么翻译方法的containsKey到SQL,尝试重写dataBaseObjDictionary.ContainsKey(x.PersonRef)为dataBaseObjDictionary.Keys.Contains(x.PersonRef)。 – Oleg

+0

我甚至会更进一步,并尝试使LINQ查询尽可能简单,以免发生错误:'int [] keys = dataBaseObjDictionary.Keys.ToArray(); ... .Where(x => keys.Contains(x.PersonRef)...'我不知道它是否会有所作为,但是我知道在Entity Framework中,我看到它在运行时抱怨类似的东西,所以你必须保持LINQ的简单 –

+0

对我的问题做了一个编辑,问题是我不能使用.Any()方法,它会导致我的错误 – thatsIT

回答

0

我认为这应该做到这一点。看起来你依靠y和两个y.anys一样。此外,您正在检查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) 
         ) 
       ); 
+0

但我无法使用。任何函数对数据库操作时,我得到这样的错误:“本地序列不能用于查询运算符的LINQ to SQL实现,除了Contains()运算符。” – thatsIT

+0

您可以使用.Count> 0吗?此外,该错误不会明确地命名为.Any作为问题,它可能是ContainsKey。 – Bob

+0

尝试过,但不幸的是不是!同样的错误。我需要使用contains。我会用更大的查询来替代过滤日期来创建另一个解决方案。 。 – thatsIT