在c#上使用linq的左/外连接与where条件子句

时间:2018-03-24 13:27:46

标签: c# sql-server linq left-join asp.net-core-2.0

我需要在查询中加入2个表。 第一个表是Entries表,其中包含某些事件,如Dance,Speak,Sing,Play等。

PreserveReferences()

另一个表包含userEntries,表示每个用户在每个事件上的得分

Id|Name  
   1|Dance  
   2|Sing  
   3|Speak  
   4|Play  
   5| etc.

现在我想要一个linq查询首先获取所有条目,然后获取给定用户的分数,以便在用户拥有noscore时为条目分数重新调整null

实施例 对于用户898128,我希望看到类似这样的内容

Dance:200,Speak:null,Sing:120 from the result

我已经尝试了以下linq查询,我得到一个空结果

Id| UserId|EntryId|Score

 1|898128 | 1     |200

 2|827329 | 2     |120

 3|898128 | 2     |100

我在使用Visual Studio 2017 15.6.3的Windows 10计算机上的ASP.NET核心2.0,实体框架核心上运行

我将非常感谢任何获取查询的指南,以便为我提供外部联接,这样即使用户没有任何分数,我也可以获得每个用户的所有条目。

请注意,这与this question错误标记的@Mahmoud不同。不同之处在于存在WHERE条件子句。

谢谢

2 个答案:

答案 0 :(得分:0)

尝试此查询。它应该解决你的问题。

 var userScores =(from e in db.Entries
                 join se in db.UserEntries on e.Id equals se.EntryId into ese
                 from nullse in ese.DefaultIfEmpty()
                 where (nullse==nulll ||(nullse!=null && nullse.UserId == "898128"))
                 select new
                 {
                    EntryLabel = e.Name,
                    EntryValue = nullse != null ? nullse.ValueAmount:"null"
                  }).ToList();

答案 1 :(得分:0)

我从this SO question找到答案。从那里,我意识到where子句的位置是问题。请参阅下面的工作代码修订

var userScores = 
(from e in db.Entries join se in db.UserEntries.Where(o => o.UserId == 
"898128" 
on e.Id equals se.EntryId                                           
into ese from se in 
ese.DefaultIfEmpty()
select new 
{
EntryLabel=e.Label,
EntryValue=se.ValueAmount,
}).ToList();

ViewData["userScores "] = userScores;

感谢您@Hazarath提供指南