首页 > 解决方案 > C# linq 是否支持“反连接”语义?

问题描述

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

标签: c#linqjoinanti-join

解决方案


连接基本上是一组不包含在另一组中的数据,可以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));

推荐阅读