首页 > 解决方案 > 第 1 列或第 2 列在同一个表上具有 2 个连接的实体框架

问题描述

我正在尝试构建一个 EF 查询以返回第 1 列或第 2 列。

第 1 列是根据查询的关系/连接从不同的表中提取的。

第 2 列是从连接表中拉出的。

这是一个调查/回答模型。有些答案是硬编码的(例如用户从列表中选择),有些是自由文本。

自由文本保存在一个表中,用户选择的值存储在另一个表中。

最终目标是开设一个带有问题和答案的 POCO 课程:

public class SurveyResponse
{
    public string Question { get; set; }
    public string Answer { get; set; }
}

我的查询看起来像:

var surveyResponses = (from ias in dataContext.AnswerSet
                       join answer in dataContext.Answer on ias.AnswerSetID equals answer.AnswerSetID
                       join oa in dataContext.OptionalAnswer on answer.PossibleAnswerID equals oa.OptionalAnswerID // this line loses valuetext answer
                       where ias.LeadID.Equals(dbLead.leadID)
                       select new SurveyResponse() { Question = "question(todo)", Answer = (answer.ValueText != "" ? answer.ValueText : oa.Title)}).ToList();

这里有一些数据显示了为什么 optionalanswer 上的连接丢失了最后一行

PossibleAnswerID    ValueText
979D3ADF-4F9C-4F4D-AC9C-034CE960003A    
EF488701-683D-4855-A9A7-7F9D78468E63    
D442F616-6D4B-4176-9F08-133E2C655BE4    
5FD57A95-B385-4CAE-ADAB-1711CEA00A08    
NULL    Questions about sales

标签: c#sqlentity-framework

解决方案


显然您的查询inner join在 sql 中生成,因此它Answer用 empty消除PossibleAnswerID。因此,您只需将其更改为left join. 可以这样做

var surveyResponses = 
    (from ias in dataContext.AnswerSet
     join answer in dataContext.Answer on ias.AnswerSetID equals answer.AnswerSetID
     join oa in dataContext.OptionalAnswer on answer.PossibleAnswerID equals oa.OptionalAnswerID into optans // this line loses valuetext answer
     from oa in optans.DefaultIfEmpty()
     where ias.LeadID.Equals(dbLead.leadID)
     select new SurveyResponse() { Question = "question(todo)", Answer = (answer.ValueText != "" ? answer.ValueText : oa.Title)}).ToList();

推荐阅读