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的主要内容,如果未能解决你的问题,请参考以下文章
这是在 .netCore 项目中使用 LINQ 查询连接两个表的正确方法吗?