Linq To Entities将值与List<int>进行比较

3

我正在使用 Entity Framework 5.0,并且在 LINQ 查询中遇到了问题。我有一个接受整数值的方法,该值随后传递到查询中。这个方法可以正常工作。

public IList<tblcoursebooking> GetStandardReport(int AttendanceID)
{
    return _UoW.tblcoursebookingRepo.All
           .Where(cb => cb.Attended.Equals(AttendanceID)
           .ToList();

} 

然而,我需要改变这个方法,使其接受一个整数列表,然后提取所有出席等于整数列表中任何值的记录。就像这样

public IList<tblcoursebooking> GetStandardReport(List<int> AttendanceIDs)
{
    return _UoW.tblcoursebookingRepo.All
           .Where(cb => cb.Attended.Equals == any AttendanceIDs
           .ToList();
} 

我想尝试使用ContainsAny LINQ关键字,但由于Attended只是一个单值而不是集合,所以在点后面可用的唯一属性是: CompareTo、 Equals、 GetHashCode、 GetType、 GetTypeCode、 ToString 请问有人能帮忙吗?
谢谢您的时间。
2个回答

8
使用 Contains 函数,它将把每个ID与给定的列表进行匹配:
return _UoW.tblcoursebookingRepo.All
       .Where(cb => AttendanceIDs.Contains(cb.Attended))
       .ToList();

总的来说,要记住Where子句只是一个带有嵌套if语句(非常复杂的)的foreach循环。它需要一个求值为布尔值的表达式。如果你只需要检查一个项目,而不使用LinQ,你很快就能想出类似这样的东西:

if(AttendanceIDs.Contains(myItem.Attended))

您可以像上面展示的那样,完全以相同的方式处理LinQ的Where子句 :) 如果您感到困惑,只需考虑如何检查一次,因为LinQ将为您完成迭代部分。
更新
如Faisal的答案中所述,WhereIn提供了类似的功能。尚未使用过,但它似乎是一种更简洁的方法。
我没有改变我的答案,因为我认为指出如何在Where子句中使用布尔值评估更重要,这也应该有助于您在将来遇到类似问题时使用WhereIn无法解决的情况。
但是,在这种特殊情况下,您也可以使用WhereIn :-)

3

您需要使用WhereIn。

public static void Main()
{
  using (MyObjectContext context = new MyObjectContext())
  {
    //Using method 1 - collection provided as collection
    var contacts1 =
      context.Contacts.WhereIn(c => c.Name, GetContactNames());

    //Using method 2 - collection provided statically
    var contacts2 = context.Contacts.WhereIn(c => c.Name,
      "Contact1",
      "Contact2",
      "Contact3",
      "Contact4"
      );
  }
}

'Contains()'在使用Linq to Entities时的解决方法是什么?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接