代码之家  ›  专栏  ›  技术社区  ›  Josh

带where条件子句的c上linq的左/外连接

  •  5
  • Josh  · 技术社区  · 8 年前

    我有两个表需要加入到查询中。 第一个表是条目表,其中包含某些事件,如舞蹈、说话、唱歌、玩耍等。

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

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

    Id| UserId|EntryId|Score
    
     1|898128 | 1     |200
    
     2|827329 | 2     |120
    
     3|898128 | 2     |100
    

    现在我需要一个linq查询,首先获取所有条目,然后获取给定用户的条目分数,如果用户没有核心,则为条目分数返回null

    实例 对于用户898128,我想看到如下内容

    舞蹈:200,说话:空,唱歌:120

    我尝试了以下linq查询,结果为空

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

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

    我将非常感谢任何关于获得正确查询的指导,以便给我一个外部联接,这样我就可以获得每个用户的所有条目,即使用户没有任何分数。

    请注意,这与 this question 错误标记为 @Mahmoud 作为其副本。区别在于WHERE条件子句的存在。

    非常感谢。

    2 回复  |  直到 8 年前
        1
  •  4
  •   user9405863    8 年前

    尝试此查询。它应该可以解决您的问题。

     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();
    
        2
  •  3
  •   Josh    8 年前

    我从中找到了答案 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 给你的向导