Linq中使用复合键进行Join()操作

6

我想要进行一个涉及两个表格的请求。

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

页面类型表格: Id,LangId(主键)

那么怎么做呢?在这里,我只需要添加PageTypeLangId。

    return context.Pages
            .Join(context.PageTypes, p => p.PageTypeId, pT => pT.Id,(p, pT) => new { p, pT })

i would like :

 select * from Page inner join PageType on Page.PageTypeId=PageType.Id and     Page.PageTypeLangId=PageType.LangId

感谢您的帮助!

为什么你不使用LangId(主键)进行连接?这似乎是你在这里描述的内部和外部选择器所需的一部分。你想要的结果是什么? - Ryan Gates
我不知道如何添加另一个字段... 我想要的是: select * from Page inner join PageType on Page.PageTypeId=PageType.Id and Page.PageTypeLangId=PageType.LangId... - Olivier Albertini
1个回答

14
以下应该有效:
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 });

我尝试了这个,但是出现了以下错误:错误16:无法从使用中推断出方法'System.Linq.Enumerable.Join<TOuter,TInner,TKey,TResult>(System.Collections.Generic.IEnumerable<TOuter>, System.Collections.Generic.IEnumerable<TInner>, System.Func<TOuter,TKey>, System.Func<TInner,TKey>, System.Func<TOuter,TInner,TResult>)'的类型参数。请明确指定类型参数。D:\website\Dev\Master\DAO\Repository\PageRepository.cs 95 17 DAO - Olivier Albertini
1
在这种情况下,您的数据类型不匹配。p.PageTypeLangId 的类型是什么?pT.LangId 的类型又是什么? - Daniel Hilgarth
对于 p.PageTypeLangId 和 p.PageTypeId,使用 Nullable<int>,对于 Id 和 LangId 使用 int。 - Olivier Albertini
2
@Olivier: 我会使用 HasValueValueHasValuewhere 子句中过滤掉那些没有页面类型语言 ID 的页面,这样您就可以安全地在连接中访问该值。 过滤它们不会减少结果集,因为它们将被连接过滤掉,因为没有具有 null 语言 ID 的页面类型。 - Daniel Hilgarth
4
如果你收到了“无法从用法中推断。尝试明确指定类型参数”的消息,你可能还需要为匿名对象的键设置相同的名称。他们在示例中这样做了,但很容易被忽视。.Join(context.PageTypes, p => new { Id = p.PageTypeId, LangId = p.PageTypeLangId.Value }, pT => new { pT.Id, pT.LangId }, (p,pT)=> new { p,pT }); - Xipooo
如何做类似的事情,但我需要使用LEFT JOIN呢?https://stackoverflow.com/questions/63991230/how-to-make-linq-join-work-if-one-of-the-fields-in-composite-key-is-nullable - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接