3

我用谷歌搜索了一会儿,没有找到直接的反连接语义示例。以 C# LINQ 为例,如何做到这一点?

4

3 回答 3

4

连接基本上是一组不包含在另一组中的数据,可以Linq用这样的 an表示IEnumerable.Except

double[] numbers1 = { 2.0, 2.0, 2.1, 2.2, 2.3, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2);

foreach (double number in onlyInFirstSet)
    Console.WriteLine(number);

这当然需要IEqualityComparer为自定义类定义一个。

使用的另一种语法where是:

var antiJoin = numbers1.Where(number => !numbers2.Contains(number));

在 Microsoft 文档上阅读有关Enumerable.Except 方法的更多信息。

编辑:

至于“ dbdriven linq ”,这是一个可以Entity Framework使用的示例Except


var filteredProducts = db.Products.ToList()
    .Except(db.Orders.Where(o => o.OrderId = 123)
        .Select(o => o.Product).ToList())
    .ToList();

至于where替代方案:

var filterProducts = db.Orders.Where(o => o.OrderId = 123)
    .Select(o => o.Product).ToList();
var antiJoinProducts = db.Products.Where(p => !filterProducts.Contains(p));
于 2019-07-26T09:39:21.777 回答
3

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

如果您想在查询中包含您找不到部门(本质上是 a left outer join)的员工,您可以执行以下操作:

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 };

如果您只想检索无法匹配部门的员工(anti join我猜那是您的),那么您只需添加一个subdept is null这样的条件:

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 };

有关left outer joinC# Linq 中 s 的更多信息,您可以查看内容。

于 2019-07-26T09:46:11.663 回答
1

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

设置:

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

此外,如果您有相同的实体/类型列表,您可以使用Exceptmethpod(您需要定义自己的比较器)。

于 2019-07-26T09:41:21.333 回答