Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ避免在Where()子句中调用Contains()?_C#_Linq - Fatal编程技术网

C# 如何使用LINQ避免在Where()子句中调用Contains()?

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)); 但我在寻找相反的结果。你能帮忙吗?谢谢 您在中查找的内容称为反加入。在关系数据库中,它通常使用左外部联接(或者如果我们使用相同

我有一个非常简单的LINQ表达式:

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。使用vs
Contains
然后问一个不理解的具体问题。您可以在SQL中准备一个
Contain
转换为
,但是
Any()
转换为
Exist
,并且性能存在差异
Contains
有什么问题?如果您担心大型列表的性能,请使用
HashSet
而不是
IEnumerable
。具体来说,这没有问题。我希望更深入地理解LINQ。使用vs
Contains
然后问一个不理解的具体问题。您可以在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);