Wuz*_*uzi 5 c# linq join duplicates
我正在使用 LINQ 尝试获取角色的所有衣服。
我的查询如下所示:
var characterList = from characters in ContextFactory.Instance.Characters
where characters.UserId == user.Id
join traits in ContextFactory.Instance.CharacterTraits
on characters.Id equals traits.CharacterId
join clothes in ContextFactory.Instance.CharacterClothes
on characters.Id equals clothes.CharacterId
select new {
characters.Id,
characters.Name,
characters.Gender,
characters.Level,
characters.Money,
characters.Bank,
characters.LastLogin,
characters.PlayedTime,
traits,
clothes };
Run Code Online (Sandbox Code Playgroud)
然后我将其序列化以在 javascript 中用作 JSON。
这段代码为我拥有的每件衣服返回一个用户,我希望它将所有衣服分组到一个数组中。我怎么能这么做呢?
当前结果:

谢谢
为此,您需要使用GroupJoin:注意在连接末尾添加了into
var characterList = from characters in ContextFactory.Instance.Characters
where characters.UserId == user.Id
join t in ContextFactory.Instance.CharacterTraits
on characters.Id equals t.CharacterId into traits
join c in ContextFactory.Instance.CharacterClothes into clothes
on characters.Id equals c.CharacterId
select new { /* As before */ }
Run Code Online (Sandbox Code Playgroud)
在 MSDN 上阅读更多内容:执行分组连接
请注意,如果您使用 EF,则无需编写联接。正确定义导航属性并使用它Include可以让您以更少的工作获得所需的内容。
最后,请注意,即使有条件,Where这也会返回IEnumerable<>结果。如果您只想要一条包含所有这些信息的记录,则在末尾添加,将其全部包装起来,或者FirstOrDefault更好的是删除where查询中的子句并执行以下操作:
var character = (from characters in ContextFactory.Instance.Characters
join t in ContextFactory.Instance.CharacterTraits
on characters.Id equals t.CharacterId into traits
join c in ContextFactory.Instance.CharacterClothes into clothes
on characters.Id equals c.CharacterId
select new { /* As before */ }).FirstOrDefault( x=> x.id = user.Id);
Run Code Online (Sandbox Code Playgroud)