C# C“linq支持”吗;“反加入”;语义学?

C# C“linq支持”吗;“反加入”;语义学?,c#,linq,join,anti-join,C#,Linq,Join,Anti Join,我在谷歌上搜索了一会儿,没有找到直接的反连接语义示例。例如,如何在C#LINQ中实现这一点?反连接基本上是一组不包含在另一个集合中的数据,可以在LINQ中用IEnumerable表示。除此之外: double[]numbers1={2.0,2.0,2.1,2.2,2.3,2.3,2.4,2.5}; 双[]数字2={2.2}; IEnumerable only yinFirstSet=numbers1.Exception(numbers2); foreach(仅在第一组中为双倍数字) 控制台写入线

我在谷歌上搜索了一会儿,没有找到直接的反连接语义示例。例如,如何在C#LINQ中实现这一点?

反连接基本上是一组不包含在另一个集合中的数据,可以在
LINQ
中用
IEnumerable表示。除此之外:

double[]numbers1={2.0,2.0,2.1,2.2,2.3,2.3,2.4,2.5};
双[]数字2={2.2};
IEnumerable only yinFirstSet=numbers1.Exception(numbers2);
foreach(仅在第一组中为双倍数字)
控制台写入线(编号);
这当然需要为自定义类定义
IEqualityComparer

另一种使用
的语法是:

var antiJoin=numbers1.Where(number=>!numbers2.Contains(number));
阅读有关Microsoft文档的更多信息

编辑:

对于“db驱动linq”,这里有一个示例,它将使用
实体框架
,除了


var filteredProducts = db.Products.ToList()
    .Except(db.Orders.Where(o => o.OrderId = 123)
        .Select(o => o.Product).ToList())
    .ToList();
对于
,其中
备选方案:

var filterProducts = db.Orders.Where(o => o.OrderId = 123)
    .Select(o => o.Product).ToList();
var antiJoinProducts = db.Products.Where(p => !filterProducts.Contains(p));

我认为没有直接的方法来实现这一点,但是使用两种扩展方法是很容易的

设置:

public class Class1
{
  public int Id;
  public string Info;
}

public class Class2
{
  public int Id;
  public string Data;
}
用法:

List<Class1> l1 = new List<Class1>() { new Class1() { Id = 1, Info = "abc" }, new Class1() { Id = 2, Info = "123" } };
List<Class2> l2 = new List<Class2>() { new Class2() { Id = 2, Data = "dsfg" }, new Class2() { Id = 3, Data = "asdfsaf" } };

l1 = l1.Where(c1 => ! l2.Select(c2 => c2.Id).Contains(c1.Id)).ToList();
List l1=new List(){new Class1(){Id=1,Info=“abc”},new Class1(){Id=2,Info=“123”};
List l2=new List(){new Class2(){Id=2,Data=“dsfg”},new Class2(){Id=3,Data=“asdfsaf”};
l1=l1.Where(c1=>!l2.Select(c2=>c2.Id).Contains(c1.Id)).ToList();

另外,如果你有相同的实体/类型列表,你可以使用
,除了
methpod(你需要定义自己的比较器)。

假设这与你之前的问题有关-

如果您想在查询中包含找不到部门的员工(基本上是一个
左外部联接
),您可以执行以下操作:

var result = from e in employees
                 join d in departments on e.DeptId equals d.DeptId into gj
                 from subdept in gj.DefaultIfEmpty()
                 select new { e.EmpName, subdept?.DeptName };
如果您只想检索与部门不匹配的员工(我猜这是您的
反加入
),那么您只需添加
子部门为空
如下:

var result = from e in employees
                 join d in departments on e.DeptId equals d.DeptId into gj
                 from subdept in gj.DefaultIfEmpty()
                 where subdept is null
                 select new { e.EmpName, subdept?.DeptName };

有关C#Linq中的左外联接的详细信息,请查看。

反联接是右键为空的左联接?然后你有你的答案如果MoreLinq是一个选项,使用。