代码之家  ›  专栏  ›  技术社区  ›  0014

使用Lambda语法的C#LINQ多个GroupJoin

  •  2
  • 0014  · 技术社区  · 7 年前

    我有3张表,我正试图用左连接将它们组合在一起。在我的应用程序中,所有LINQ表达式都是查询链格式(lambda表达式)。

    我正试图找出如何使用LINQ完成这个查询;

    这是我的SQL查询;

    select i.INVOICE_NUMBER, ic.CustomerName, o.BusinessUnit
    from Invoices_Daily as i
    left join intercompany as ic on i.customer_number = ic.customernumber
    left join ordertypes as o on i.LINE_ORDERTYPE = o.OrderType
    

    我试着把 GroupJoin 具体如下:;

    var commissions = data
        .GroupJoin(genericNameList,
            d => d.CUSTOMER_NUMBER,
            g => g.CustomerId,
            (d, g) => new { d, generic = g.FirstOrDefault() })
        .GroupJoin(intercompanies,
            dd => dd.d.CUSTOMER_NAME,
            i => i.CustomerId,
            (d, i) => new { data = d.d, intercompanies = i.FirstOrDefault() })
        .Select(_ => new MainGridViewModel
        {
            INVOICE_DATE = _.d.INVOICE_DATE,
            EndCustomer = _.generic == null ? _.d.CUSTOMER_NAME : _.generic.EndCustomer ?? _.d.CUSTOMER_NAME,
            LINE_ORDERTYPE = _.i.OrderType
        })
        .ToList();
    

    但是我有一个语法错误,写在下面;

    错误CS0411无法根据用法推断方法“Enumerable.GroupJoin(IEnumerable,IEnumerable,Func,Func,Func,TResult>)”的类型参数。请尝试显式指定类型参数。

    1 回复  |  直到 7 年前
        1
  •  2
  •   johnny 5    7 年前

    我根据请求编写了一个测试示例,显示了正确的语法,这一切都应该正常。

    public class Data
    {
        public string CUSTOMER_NUMBER { get; set; }
        public string CUSTOMER_NAME { get; set; }
    }
    
    public class NameList
    {
        public string CustomerId { get; set; }
    
    }
    
    public class InterCompanies
    {
        public string CustomerId { get; set; }
    }
    
    public class Test
    {
        public void TMP()
        {
            var data = new List<Data>();
            var genericNameList = new List<NameList>();
            var intercompanies = new List<InterCompanies>();
    
            var commissions = data
                .GroupJoin(genericNameList,
                    d => d.CUSTOMER_NUMBER,
                    g => g.CustomerId,
                    (d, g) => new { d, generic = g.FirstOrDefault() })
                .GroupJoin(intercompanies,
                    dd => dd.d.CUSTOMER_NAME,
                    i => i.CustomerId,
                    (d, i) => new { data = d.d, intercompanies = i.FirstOrDefault() })
                .ToList();
        }
    }
    

    我最初的想法是你的客户号和客户名是错误的,因为你为什么在同一个类中有两个字段具有相同的值。但是,既然您向我保证了它们是正确的,那么也许您正在交换连接中数据上预期的字段的顺序,如果不看到您的数据模型,很难说清楚。

    也许你的第二次加入应该是这样的:

    .GroupJoin(intercompanies,
                dd => dd.d.CUSTOMER_NUMBER,
                i => i.CUSTOMER_NAME,
    
    推荐文章