linq 将一个表中的一列与另一个表中的三列连接起来

irlmq6kh  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(125)

我需要编写一个LINQ查询,将一个DataTable列连接到另一个DataTable中三个可能列之一的值。
下面的方法可行,但似乎不太正确。有更好的方法吗?

var query = dtDescriptions.AsEnumerable()
            .GroupJoin(dtProducts.AsEnumerable(),
                idA => idA.Field<string>("idA"),
                productid => productid.Field<string>("Product ID"),
                (idA, productid) => new { IDA = idA, PRODUCTID = productid })
            .GroupJoin(dtProducts.AsEnumerable(),
                idB => idB.IDA.Field<string>("idB"),
                productid => productid.Field<string>("Product ID"),
                (idB, productid) => new { IDB = idB, PRODUCTID = productid })
            .GroupJoin(dtProducts.AsEnumerable(),
                idC => idC.idB.IDA.Field<string>("idC"),
                productid => productid.Field<string>("Product ID"),
                (idC, productid) => new { IDC = idC, PRODUCTID = productid });
2jcobegt

2jcobegt1#

这看起来好多了:

var query = dtdescriptions.AsEnumerable()
            .SelectMany(x =>
                    new[] { x.Field<string>("idA"), x.Field<string>("idB"), x.Field<string>("idC") }.Distinct(),
                (x, a) => new
                {
                    id = a,
                    bringanotherfieldifneeded = x.Field<string>("Other Field")
                }
            ).Join(dtProducts.AsEnumerable(),
                descriptions => descriptions.id,
                products => products.Field<string>("Product ID"),
                (descriptions, products) => new { DESCRIPTIONS = descriptions, PRODUCTS = products });
bxgwgixi

bxgwgixi2#

你可以通过扁平化中间结果来改进你的Join方法链,但这并不能真正减少冗余,有时候使用笛卡尔积比过滤结果更好。
使用查询语法,您可以:

var q = from desc in dtDescriptions.AsEnumerable()
        from prod in dtProducts.AsEnumerable()
        where new[] {
                    desc.Field<string>("idA"),
                    desc.Field<string>("idB"),
                    desc.Field<string>("idC")
                }
                .Contains(prod.Field<string>("Product ID"))
        select new { desc, prod };

或者使用流利的语法:

var ql = dtDescriptions.AsEnumerable()
            .SelectMany(desc => dtProducts.AsEnumerable().Select(prod => new { desc, prod }))
            .Where(dp => new[] {
                       dp.desc.Field<string>("idA"),
                       dp.desc.Field<string>("idB"),
                       dp.desc.Field<string>("idC")
                   }
                   .Contains(dp.prod.Field<string>("Product ID")));

注意:如果您想跟踪匹配的字段,那就有点麻烦了。

相关问题