LINQ to objects中的语句

5
LINQ to objects中是否有SQL IN语句的等效语句?
2个回答

16

是的 - Contains

var desiredNames = new[] { "Jon", "Marc" };

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

var matches = people.Where(person => desiredNames.Contains(person.FirstName));

foreach (var person in matches)
{
    Console.WriteLine(person);
}
在LINQ to SQL中,这最终变成了一个“IN”查询。
请注意,在LINQ to Objects中,上述方法并不是非常高效。使用join更好:
var matches = from person in people
              join name in desiredNames on person.FirstName equals name
              select person;

(当然,这仍然可以使用点号表示法完成,但最终会变得有些混乱。)


谢谢!您的声誉早已闻名于世;-) - John Paul Jones
为什么这里不推荐使用内连接?如果people包含10条记录,而desiredNames包含2条记录,那么无论是否匹配,它都会在后台迭代20次。 - Pankaj
@PankajGarg:请不要这样纠缠不休——我并不总是能够立即回复。你有没有读到我帖子底部明确说明在LINQ to Objects中使用join会更好的部分? - Jon Skeet
你刚刚修改了那个答案。:) 我只是希望我们在这里都能保持一致的步调。 - Pankaj

0

在这种情况下,我会选择使用内连接。如果我使用了contains,即使只有两个匹配项,它也会迭代6次。我想强调的是,我会选择使用连接而不是IN谓词。

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

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();

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