Linq Join()与复合键

Oli*_*ini 6 c# linq

我正在尝试用两个表做出请求

表页:Id,LangId(主键)PageTypeId,PageTypeLangId(外键)

表PageType:Id,LangId(主键)

那怎么办?在这里,我想念只是添加PageTypeLangId

    return context.Pages
            .Join(context.PageTypes, p => p.PageTypeId, pT => pT.Id,(p, pT) => new { p, pT })
Run Code Online (Sandbox Code Playgroud)

我想要 :

 select * from Page inner join PageType on Page.PageTypeId=PageType.Id and     Page.PageTypeLangId=PageType.LangId
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助 !

Dan*_*rth 11

以下应该有效:

return context.Pages
              .Where(x => x.PageTypeLangId.HasValue)
              .Join(context.PageTypes,
                    p => new { Id = p.PageTypeId,
                               LangId = p.PageTypeLangId.Value },
                    pT => new { pT.Id, pT.LangId },
                    (p, pT) => new { p, pT });
Run Code Online (Sandbox Code Playgroud)

  • @Olivier:我会用`HasValue`和`Value`代替.`where`中的`HasValue`过滤掉所有没有页面类型语言ID的页面,这样您就可以安全地访问连接中的值.过滤掉它们不会减少结果集,因为它们会被连接过滤掉,因为没有语言ID为null的页面类型. (2认同)
  • 如果您收到“无法从用法推断出来。尝试明确指定类型参数”消息,您可能还需要为两个匿名对象命名相同的键。他们在示例中做到了这一点,但很容易被忽视。.Join(context.PageTypes, p => new { **Id** = p.PageTypeId, **LangId** = p.PageTypeLangId.Value }, pT => new { pT.**Id**, pT. **LangId** }, (p, pT) => new { p, pT }); (2认同)