gpt4 book ai didi

c# - LINQ - 3 个 ObservableCollections 的左连接

转载 作者:行者123 更新时间:2023-11-30 12:23:20 25 4
gpt4 key购买 nike

我定义了三个类:

public class MaterialByOperator
{
public int IdOperator{ get; set; }
public int IdMaterial { get; set;}
}

public class Material
{
public int Id { get; set; }
public string Name { get; set; }
}

public class AssignedOperator
{
public int idOperation { get; set; }
public int idOperator { get; set; }
}

IdMaterialMaterialByOperatorMaterial 的“外键” .关系是One to Many .

IdOperatorMaterialByOperatorAssignedOperator 的“外键”在One to One关系。

然后我定义这个 3 ObservableCollection :

public ObservableCollection<Material> Materials;
public ObservableCollection<MaterialByOperator> MaterialsXOperator;
public ObservableCollection<AssignedOperator> AssignedOperators;

我想要的是获取没有分配任何 Material 的运算符(operator)姓名。我现在这样做:

var mate = MaterialsXOperator.GroupBy(x => x.idOperator); //Group materials by operatorId
//left join assignedOperators with the grouped materials
var opeasigmate = AssignedOperators.GroupJoin(mate, oper => oper.idOperator,
grupo => grupo.Key, (oper, grupo) => new { oper, grupo });
var operWithoutmate = opeasigmate.Where(x => x.grupo.Count() == 0);

我想知道的是,由于我对 LINQ 的了解不是很广(信不信由你,多年来我在工作中一直禁止使用它)是否有任何最简单的方法来实现我想要的?正如我所说,我的解决方案有效,但我希望看到其他观点,希望能顺便学习一下。

最佳答案

使用 Any 绝对更简单:

var operWithoutmate = AssignedOperators
.Where(ao => !MaterialsXOperator.Any(mo => mo.IdOperator == ao.idOperator);

但通常使用 join 效率更高,所以我建议您保持这种方式。唯一的改进可能是将 x.grupo.Count() == 0 替换为 !x.grupo.Any()。此外,本例中的 GroupBy 是多余的,因此查询可能是:

var operWithoutmate = AssignedOperators
.GroupJoin(MaterialsXOperator, ao => ao.idOperator, mo => mo.IdOperator,
(ao, moGroup) => new { ao, moGroup })
.Where(r => !r.moGroup.Any())
.Select(r => r.ao);

我个人发现当涉及连接时,查询语法更容易和更易读:

var operWithoutmate = 
from ao in AssignedOperators
join mo in MaterialsXOperator on ao.idOperator equals mo.IdOperator into moGroup
where !moGroup.Any()
select ao;

关于c# - LINQ - 3 个 ObservableCollections 的左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37341900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com