【问题标题】:Linq 2 tables join but need data from 3 not needing to join all 3Linq 2 表加入但需要来自 3 的数据不需要加入所有 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 个表字段的模型

标签: c# entity-framework linq asp.net-mvc-5


【解决方案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);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多