linq在列表上留下了外部联接

时间:2012-05-24 19:26:30

标签: linq

我有3个列表,向用户付款的清单,在同一笔付款上支付的税款清单,以及在同一笔付款上支付的州税清单。

问题是,每笔付款可能不存在税收或州税,因此我需要将每笔个人付款与已缴纳的税金或州税相匹配,但如果其中一个或两个都没有,则会继续显示存在。这是我现在拥有的特定查询

    var joinEverything = 
    from IP in IndividualPaymentsList
    join TD in TaxDetailsList.DefaultIfEmpty()
        on IP.UserId equals TD.UserId
        where IP.WeekEndDate == TD.WeekEndDate
    join ST in StateTaxDetailsList.DefaultIfEmpty()
        on IP.UserId equals ST.UserId
        where IP.WeekEndDate == ST.WeekEndDate
    select new 
    {
        IP.UserId,
        FedTax = TD.CheckAmount,
        StateTax = ST.CheckAmount,
        IP.CheckAmount,
    };

目前如果记录不存在,例如州税,我得到'NullReferenceException:对象引用未设置为对象的实例。'而不是仅仅接受null作为ST.CheckAmount

中的值

1 个答案:

答案 0 :(得分:2)

您正在执行DefaultIfEmpty()这样的事情,但是您正在尝试检索设置为此默认值的对象的属性,例如TD.UserId表示您正在调用null.UserId。

下面是我试图让它工作 - 但是,我真的没有数据来测试它,所以我可能搞砸了某处的语法或者我可能试图访问一个超出范围的变量 - 给它一个如果遇到问题,请尝试告诉我:

var joinEverything = 
    from IP in IndividualPaymentsList
    join TD in TaxDetailsList
        on IP.UserId equals TD.UserId into group1
        from g1 in group1.DefaultIfEmpty()
        where g1 == null || (IP.WeekEndDate == g1.WeekEndDate)
    join ST in StateTaxDetailsList
        on IP.UserId equals ST.UserId into group2
        from g2 in group2.DefaultIfEmpty()
        where g2 == null || IP.WeekEndDate == g2.WeekEndDate
    select new 
    {
        IP.UserId,
        FedTax = (g1 != null ? g1.CheckAmount : String.Empty), // or your default value for the type
        StateTax = (g2 != null ? g2.CheckAmount : String.Empty),
        IP.CheckAmount,
    };