在linq中使用Lambda表达式时将Join转换为GROUP JOIN#

时间:2018-05-21 19:58:36

标签: c# linq lambda

我正在尝试将连接更改为LEFT外连接,但会出现各种转换错误。以下是我目前的联接,任何人都可以在不改变此联接的实际逻辑的情况下提供有关如何执行此操作的任何建议吗?

 BRAND_NAME_MAP_MASTER objBrandNameMap = DB.PFC_MAP_MASTERs.Join(
          DB.BRAND_NAME_MAPs,
          a => a.BRAND_NAME_MAP_ID, b => b.BRAND_NAME_MAP_ID,
    (a, b) => new { a, b }).Where(x => x.a.BRAND_NAME_MAP_ID == BrandNameMapID && 
        x.b.BRAND_NAME_MAP_ID == BrandNameMapID).Select(x => x.a).FirstOrDefault();

3 个答案:

答案 0 :(得分:1)

由于您只保留a到最后更改为左连接意味着不关心b是否匹配,因此结果只是:

BRAND_NAME_MAP_MASTER objBrandNameMap = DB.PFC_MAP_MASTERs
                                          .Where(a => a.BRAND_NAME_MAP_ID == BrandNameMapID)
                                          .FirstOrDefault();

答案 1 :(得分:0)

如果这是您的整个查询,您应该使用NetMage的答案。但是,如果你仍然需要做一个左外连接,那么使用它:

BRAND_NAME_MAP_MASTER objBrandNameMap = DB.PFC_MAP_MASTERs.GroupJoin(
          DB.BRAND_NAME_MAPs,
          a => a.BRAND_NAME_MAP_ID, 
          b => b.BRAND_NAME_MAP_ID,
          (a, b) => new { a, b })
          .SelectMany(
          x => x.b.DefaultIfEmpty(),
          (x,y) => new { x.a, y})
.Where(x => x.a.BRAND_NAME_MAP_ID == BrandNameMapID)
.Select(x => x.a).FirstOrDefault();

答案 2 :(得分:0)

你的意图没有意义,因为你只是取了一个。如果你只想要一个则不需要左连接。虽然我写了一个查询,它会给你左连接结果。您可以按照自己的方式使用它。

BRAND_NAME_MAP_MASTER objBrandNameMap = 
    (from Master in DB.PFC_MAP_MASTERs.Where(x=>x.BRAND_NAME_MAP_ID ==BrandNameMapID)
     join Map in DB.BRAND_NAME_MAPs.Where(z=>z.BRAND_NAME_MAP_ID ==BrandNameMapID)
     on Master.BRAND_NAME_MAP_ID equals Map.BRAND_NAME_MAP_ID
     into result
     from res in result.DefaultIfEmpty()
     select new {Master,res}).ToLisT()

希望它有所帮助。