在T-SQL中,你可以有这样的查询:

SELECT * FROM Users WHERE User_Rights IN ("Admin", "User", "Limited")

如何复制在一个LINQ实体查询?这可能吗?


当前回答

在这种情况下,我将使用内连接。如果我使用contains,它将迭代6次,尽管事实上只有一个匹配。

var desiredNames = new[] { "Pankaj", "Garg" }; 

var people = new[]  
{  
    new { FirstName="Pankaj", Surname="Garg" },  
    new { FirstName="Marc", Surname="Gravell" },  
    new { FirstName="Jeff", Surname="Atwood" }  
}; 

var records = (from p in people join filtered in desiredNames on p.FirstName equals filtered  select p.FirstName).ToList(); 

包含的缺点

假设我有两个列表对象。

List 1      List 2
  1           12
  2            7
  3            8
  4           98
  5            9
  6           10
  7            6

使用Contains,它将搜索List 2中的每个List 1项,这意味着迭代将发生49次!!

其他回答

严重吗?你们从没用过

where (t.MyTableId == 1 || t.MyTableId == 2 || t.MyTableId == 3)

在这种情况下,我将使用内连接。如果我使用contains,它将迭代6次,尽管事实上只有一个匹配。

var desiredNames = new[] { "Pankaj", "Garg" }; 

var people = new[]  
{  
    new { FirstName="Pankaj", Surname="Garg" },  
    new { FirstName="Marc", Surname="Gravell" },  
    new { FirstName="Jeff", Surname="Atwood" }  
}; 

var records = (from p in people join filtered in desiredNames on p.FirstName equals filtered  select p.FirstName).ToList(); 

包含的缺点

假设我有两个列表对象。

List 1      List 2
  1           12
  2            7
  3            8
  4           98
  5            9
  6           10
  7            6

使用Contains,它将搜索List 2中的每个List 1项,这意味着迭代将发生49次!!

这可能是直接使用LINQ扩展方法检查in子句的可能方式

var result = _db.Companies.Where(c => _db.CurrentSessionVariableDetails.Select(s => s.CompanyId).Contains(c.Id)).ToList();

这不是确切的IN操作符,但它可能帮助您获得预期的结果,并且可能是一种更通用的方法(因为它允许比较两个集合):INTERSECT

下面是一个工作示例

var selected = 
  users.Where(u => 
    new[] { "Admin", "User", "Limited" }.Intersect(new[] {u.User_Rights}).Any()
  );
OR
var selected = 
  users.Where(u => 
    new[] {u.User_Rights}.Intersect(new[] { "Admin", "User", "Limited" }).Any()
  );

我想应该对性能进行基准测试(针对目前接受的答案),以充分验证这个解决方案……

编辑:

正如Gert Arnold所要求的例子(EF 6): 这段代码给出了名字和/或姓氏匹配“John”或“Doe”的任何用户:

// GET: webUsers
public async Task<ActionResult> Index()
{
  var searchedNames = new[] { "John", "Doe" };

  return 
    View(
      await db
        .webUsers
        .Where(u => new[] { u.firstName, u.lastName }.Intersect(searchedNames).Any())
        .ToListAsync()
    );

  //return View(await db.webUsers.ToListAsync());
}

这应该够你的目的了。它比较两个集合,并检查其中一个集合的值是否与另一个集合中的值匹配

fea_Features.Where(s => selectedFeatures.Contains(s.feaId))