Linq 连接返回重复结果

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。

这段代码为我拥有的每件衣服返回一个用户,我希望它将所有衣服分组到一个数组中。我怎么能这么做呢?

当前结果:

图像

谢谢

Gil*_*een 3

为此,您需要使用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)