【问题标题】:Linq to SQL replace .Any() with .Contains()Linq to SQL 将 .Any() 替换为 .Contains()
【发布时间】: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 =&gt; keys.Contains(x.PersonRef)...。我不知道它是否会有所作为,但我知道 Entity Framework,我已经看到它在运行时抱怨类似的事情,所以你必须保持 LINQ 简单。
  • 对我的问题进行了编辑。问题是我不能使用 .Any() 方法。它给我一个错误。

标签: c# linq linq-to-sql


【解决方案1】:

我认为应该这样做。看起来您依赖 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)
                       )
                );

【讨论】:

  • 但是在对数据库进行操作时,我不能使用 .Any 函数。我收到此错误:“本地序列不能在 LINQ to SQL 实现的查询运算符中使用,但 Contains() 运算符除外。”
  • 你可以使用 .Count > 0 吗?此外,该错误并未明确将 .Any 命名为问题。它很可能是 ContainsKey。
  • 也试过了,但不幸的是没有!同样的错误。我需要使用包含。我将使用更大的查询而不是日期过滤器来制作另一个解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多