C# C“linq支持”吗;“反加入”;语义学?
我在谷歌上搜索了一会儿,没有找到直接的反连接语义示例。例如,如何在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(仅在第一组中为双倍数字) 控制台写入线
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是一个选项,使用。