Linq 2 表加入但需要来自 3 的数据不需要加入所有 3

Posted

技术标签:

【中文标题】Linq 2 表加入但需要来自 3 的数据不需要加入所有 3【英文标题】:Linq 2 tables join but need data from 3 not needing to join all 3 【发布时间】:2019-09-05 00:12:18 【问题描述】:

我有 3 个表我需要从中获取数据实际上只有 2 个我需要使用 Linq 进行连接,但我需要来自预计的项目名称,我需要将其插入我使用 linq 创建的相同模型。我在 context.Projects 中尝试了 proj.ProjectId = detail.ProjectId 但它说不能将 int 转换为 bool 并且我没有在任何地方声明 bool?这是我的linq。而整个方法实际上

PS - 这是我创建的最新操作,但仍然不是 100% 正确,但这是获取 3 个表数据的正确想法吗?

     public ActionResult DisplayAllTimeSheetDetails(int masterid)
        
            var masterModel = context.TimeSheetMaster.Where(w => 
                              w.TimeSheetMasterId.Equals(masterid)).FirstOrDefault();

            var detailM = context.TimeSheetDetails.Where(t => 
                          t.TimeSheetMasterId.Equals(masterModel.TimeSheetMasterId))
                          .FirstOrDefault();

            var project = context.Projects.Where(p => p.ProjectId.Equals(
                          detailM.ProjectId)).FirstOrDefault();


            var details = (from master in context.TimeSheetMaster
                           join detail in context.TimeSheetDetails
                           on master.TimeSheetMasterId equals detail.TimeSheetMasterId
                           //from proj in context.Projects where proj.ProjectId = detail.ProjectId
                           select new TimeSheetDetailsModel()
                           
                               Sunday = detail.Sunday,
                               Monday = detail.Monday,
                               Tuesday = detail.Tuesday,
                               Wednesday = detail.Wednesday,
                               Thursday = detail.Thursday,
                               Friday = detail.Friday,
                               Saturday = detail.Saturday,
                               Hours = detail.Hours,
                               Comment = master.Comment,
                               ProjectName = project.ProjectName
                           ).ToList();

            return View(details);
        
public class TimeSheetDetailsModel
    
        [Display(Name = "Time Sheet ID")]
        public int TimeSheetId  get; set; 
        [Display(Name = "Day of Week")]
        public string DaysOfWeek  get; set; 
        [Display(Name = "Hours")]
        public int? Hours  get; set; 
        [Display(Name = "Period")]
        public string Period  get; set; 
        [Display(Name = "Project ID")]
        public int ProjectId  get; set; 
        [Display(Name = "User ID")]
        public string UserId  get; set; 
        [Display(Name = "Date Created")]
        public DateTime DateCreated  get; set; 
        [Display(Name = "Time Sheet Master ID")]
        public int TimeSheetMasterId  get; set; 
        [Display(Name = "Project Name")]
        public string ProjectName  get; set; 
        public string Comment  get; set; 
        public int Sunday  get; set; 
        public int Monday  get; set; 
        public int Tuesday  get; set; 
        public int Wednesday  get; set; 
        public int Thursday  get; set; 
        public int Friday  get; set; 
        public int Saturday  get; set; 
    

【问题讨论】:

我想你可能在构思你的想法时遇到了麻烦——我根本无法理解 请把型号放在这里 为什么还需要明确加入?您的 TimeSheetMasterDetail 应该有 TimeSheetMaster 导航属性,您可以使用它 - EF 将隐式处理连接。您的项目也是如此,其中 TimeSheetDetails 应该有一个项目导航属性。 如果您确实需要来自第三张表的数据,您确实需要第二次连接(或执行单独的查询,但这也只是执行 FK=PK 索引扫描)。但是,请注意 LINQ 语法是 c# 语法,因此您需要使用 == 运算符(而不是 where 子句中的 = 运算符)进行 PK=FK 比较 这是我正在填充的模型 我在时间表表中拥有所有数据,除了项目我需要调用第三个表以通过 Id 获取项目名称,但我不需要进行任何联接对于这个查询,我只需要项目名称,这是我的模型,我正在填充 public int TimeSheetId get;放; 公共字符串 DaysOfWeek 获取;放; 公共整数?小时得到;放; 公共整数?项目 ID 获取;放; 公共字符串用户 ID 获取;放; + 更多属性字段,它只是一个具有 3 个表字段的模型 【参考方案1】:

我让它像这样工作。我愿意接受其他答案和更清洁的方式。

public ActionResult DisplayAllTimeSheetDetails(int masterid)
            
            var masterModel = context.TimeSheetMaster.Where(w => 
                              w.TimeSheetMasterId.Equals(masterid)).FirstOrDefault();

            var detailM = context.TimeSheetDetails.Where(t =>
                          t.TimeSheetMasterId.Equals(masterModel.TimeSheetMasterId)).FirstOrDefault();//.ToList();

            var project = context.Projects.Where(p => p.ProjectId==detailM.ProjectId).FirstOrDefault();


            var details = (from master in context.TimeSheetMaster
                           join detail in context.TimeSheetDetails
                           on master.TimeSheetMasterId equals detail.TimeSheetMasterId
                           select new TimeSheetDetailsModel()
                           
                               Sunday = detail.Sunday,
                               Monday = detail.Monday,
                               Tuesday = detail.Tuesday,
                               Wednesday = detail.Wednesday,
                               Thursday = detail.Thursday,
                               Friday = detail.Friday,
                               Saturday = detail.Saturday,
                               Hours = detail.Hours,
                               Comment = master.Comment,
                               ProjectName = project.ProjectName
                           ).FirstOrDefault();

            return View(details);
        

【讨论】:

以上是关于Linq 2 表加入但需要来自 3 的数据不需要加入所有 3的主要内容,如果未能解决你的问题,请参考以下文章

执行 Linq 组加入是不是有更好的解决方案?

LINQ:如何使用动态键连接两个数据表

这是在 .netCore 项目中使用 LINQ 查询连接两个表的正确方法吗?

LINQ to SQL:对来自订购系统的多个表的报告的聚合数据进行复杂查询

加入多个表后如何处理空值

我可以使用 linq 将表加入列表吗? [复制]