C# 如何使用LINQ避免在Where()子句中调用Contains()?
我有一个非常简单的LINQ表达式:C# 如何使用LINQ避免在Where()子句中调用Contains()?,c#,linq,C#,Linq,我有一个非常简单的LINQ表达式: class Foo { ... int Id { get; } } IEnumerable<Foo> foos = ...; IEnumerable<int> ids = ...; var remainder = foos.Where(f => !ids.Contains(f.Id)); 但我在寻找相反的结果。你能帮忙吗?谢谢 您在中查找的内容称为反加入。在关系数据库中,它通常使用左外部联接(或者如果我们使用相同
class Foo
{
...
int Id { get; }
}
IEnumerable<Foo> foos = ...;
IEnumerable<int> ids = ...;
var remainder = foos.Where(f => !ids.Contains(f.Id));
但我在寻找相反的结果。你能帮忙吗?谢谢 您在中查找的内容称为反加入。在关系数据库中,它通常使用
左外部联接
(或者如果我们使用相同的术语,则使用左半联接)来实现,并检查右侧
是否为NULL
。最近的LINQ构造是with检查空的内部组
下面是它将如何查找您的示例(将其与基于的版本进行比较)
查询语法:
方法语法:
您在中查找的内容称为反加入。在关系数据库中,它通常使用左外部联接
(或者如果我们使用相同的术语,则使用左半联接)来实现,并检查右侧
是否为NULL
。最近的LINQ构造是with检查空的内部组
下面是它将如何查找您的示例(将其与基于的版本进行比较)
查询语法:
方法语法:
包含的有什么问题?如果您担心大型列表的性能,请使用HashSet
而不是IEnumerable
。具体来说,这没有问题。我希望更深入地理解LINQ。使用vsContains
然后问一个不理解的具体问题。您可以在SQL中准备一个Contain
转换为,但是Any()
转换为Exist
,并且性能存在差异Contains
有什么问题?如果您担心大型列表的性能,请使用HashSet
而不是IEnumerable
。具体来说,这没有问题。我希望更深入地理解LINQ。使用vsContains
然后问一个不理解的具体问题。您可以在SQL中准备一个Contain
转换为,但是Any()
转换为Exist
,并且在性能上存在差异
var intersection = foos.Join(ids, f => f.Id, i => i, (f, id) => f);
var remainder = from foo in foos
join id in ids on foo.Id equals id into idGroup
where !idGroup.Any()
select foo;
var remainder = foos.GroupJoin(ids, foo => foo.Id, id => id, (foo, idGroup) => new { foo, idGroup })
.Where(e => !e.idGroup.Any())
.Select(e => e.foo);