【问题标题】:LINQ query with array element in Where clause在 Where 子句中使用数组元素的 LINQ 查询
【发布时间】:2013-07-15 17:32:16
【问题描述】:

我在 for 循环中有许多 LINQ 查询,如下所示:

Department department = db.Departments.Single(d => d.DepartmentID == teams[i].DepartmentID);

问题是 LINQ 不喜欢与数组元素进行比较并引发异常 LINQ to Entities 无法识别方法“get_Item(Int32)”。除了为我要选择的团队列表中的每个属性声明局部变量之外,还有更好的方法来解决这个问题吗?我想避免用诸如

之类的东西填充我的 for 循环
int departmentID = teams[i].DepartmentID;
string teamName = teams[i].TeamName;

等等

【问题讨论】:

    标签: c# .net linq entity-framework linq-to-entities


    【解决方案1】:

    我想避免用...之类的东西填充我的 for 循环

    不幸的是,这通常是最好的选择。表达式求值需要能够将表​​达式树转换为SQL,它不知道如何处理数组元素。制作临时变量是处理这种情况的最简单、最可维护的方法。

    【讨论】:

      【解决方案2】:

      我不知道这会解决您的问题,但您可以尝试将 for 循环更改为 for each 循环,以便您可以引用当前对象,而不是通过索引访问它。问题是 SQL Server 不知道数组是什么,因此当您尝试使用有效的 C# 语法时,它不知道如何将其转换为表达式树以生成必要的 SQL。如果 for each 建议不起作用,那么我认为你现在的做法是被困住了。

      【讨论】:

      • 通常我会。但是在这种情况下,我在 for 循环中索引了 13 个不同的数组。
      • @Legion 真不幸。我认为没有比分配给局部变量更好的选择了。
      【解决方案3】:

      你为什么不写这样的东西:

      var query = from d in db.Departments
                      from t in teams
                      where d.DepartmentID == t.DepartmentID && d.Team == t.TeamName
                      select d;
      

      这可以很容易地转换为表达式树,最后转换为 SQL。

      【讨论】:

        猜你喜欢
        • 2010-10-24
        • 2018-08-14
        • 2022-01-04
        • 1970-01-01
        • 2020-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多