在多个条件下比较列表

时间:2014-04-03 16:09:36

标签: c# linq

public class ConsumableThreshold
{
    public int ThresholdType { get; set; }
    public int ManufacturerID { get; set; }
    public int ModelID { get; set; }
    public int ConsumableVariantID { get; set; }
}

我正在尝试检查共享属性的两个对象列表。 我需要根据以前的比赛结果检查各种其他属性。

例如,如果ThresholdType匹配,那么我需要检查第二个属性,如果匹配,我需要检查ModelID。

我有这个查询,它有效地完成了我想要的但是它存在问题主要是因为我进一步向下钻,可读性将会降低。

var query= existingThresholds.Where(
    e => defaultThresholds.Any(
        d => d.ThresholdType == e.ThresholdType)).Where(
             e => defaultThresholds.Any(
                d => d.ManufacturerID == e.ManufacturerID)).ToList();

我想使用join执行此操作,但它不支持&&运算符。

var query2 = from e in existingThresholds
             join d in defaultThresholdson 
             e.ThresholdType equals d.ThresholdType &&
             e.ManufacturerID equals d.ManufacturerID
             select e;

有没有办法将此作为查询编写而不链接.Where()条件?

2 个答案:

答案 0 :(得分:6)

当然 - 您只是尝试加入复合键,通常使用匿名类型来完成:

var query2 = from e in existingThresholds
             join d in defaultThresholdson 
             on new { e.ThresholdType, e.ManufacturerID } equals 
                new { d.ThresholdType, d.ManufacturerID }
             select e;

(稍后忽略加入的一半,确实有点奇怪......)

答案 1 :(得分:3)

  

有没有办法把它写成一个没有链接.Where()条件的查询?

是的,使用匿名类型,它具有内置的相等性检查,可以按名称比较所有属性的值:

var query2 = from e in existingThresholds
             join d in defaultThresholds
             on       new { e.ThresholdType , e.ManufacturerID }
               equals new { d.ThresholdType , d.ManufacturerID }
             select e;