【问题标题】:Lambda expression Join with last occurrence of right tableLambda 表达式加入右表的最后一次出现
【发布时间】:2016-07-27 07:17:02
【问题描述】:

我有两张桌子TaskEmpTask

Table: Task    Table: EmpTask
__________     ________________________
ID | Title     ID | TaskID  | XXXX
__________     ________________________
1  | task1     1  | 1       | emptask1
2  | task2     2  | 1       | emptask2  (this is last occurance of taskID 1)
__________     3  | 2       | emptask3    
               4  | 2       | emptask4  (this is last occurance of taskID 2)
               ________________________

预期结果:

________________________
ID | Title   | XXXX
________________________
1  | task1   | emptask2
2  | task2   | emptask4
________________________

我需要帮助以 Lambda 表达式编写查询。

提前致谢。

【问题讨论】:

  • 我已经为此编写了代码: var Tasks = db.Task.Join(TS.EmpTask, t => t.ID, et => et.TaskID, (t, et) => new { t, et }) .Select(m => new TaskObject { ID = m.t.ID, Title = m.t.Title, XXXX= m.et.XXXX, });我应该在这里添加什么?
  • 我不太确定您的预期结果。您是否只想最后次出现与Task 相关的EmpTask,还是应该是与Task 相关的所有EmpTask 的列表?
  • 定义“最后一个”。如果您的数据未排序,则没有第一个或最后一个的概念。您是否在ID 上对数据进行排序?或XXXX?
  • 我想要一份所有任务的列表 - 与 EmpTask 表中的一个原始数据连接 - 该行必须具有最大 id 和 taskId 与任务表的 id 多

标签: c# sql linq lambda


【解决方案1】:

假设你想要max EmpTask

var result = (from t in db.Task
         join r in db.EmpTask
                      .GroupBy(i => i.TaskID)
                      .Select(i => new { TaskID = i.Key, EmpTaskId = i.Max(t => t.ID)})
                  on t.ID equals r.TaskID
         join et in db.EmpTask on r.EmpTaskId equals et.ID
         select new
         {
            ID = t.ID,
            Title = t.Title,
            XXXX = et.XXXX
         }).ToList();

Lambda 表达式

var result = db.Task.Join(
            db.EmpTask
                      .GroupBy(i => i.TaskID)
                      .Select(i => new { TaskID = i.Key, EmpTaskId = i.Max(t => t.ID)})
                  ,
            t => t.ID,
            r => r.TaskID,
            (t, r) => new { Task = t, EmpTaskTmp = r}
         ).Join(
            db.EmpTask,
            et => et.ID
            y => y.EmpTaskTmp.EmpTaskId,
            (et, y) => new { Task = y.Task, MaxEmpTask = et}
         ).Select(i => new
         {
            ID = i.Task.ID,
            Title = i.Task.Title,
            XXXX = i.MaxEmpTask.XXXX
         });         

【讨论】:

  • 你能不能把它写成 Lambda 表达式。谢谢
【解决方案2】:

我设法得到了答案。感谢大家的帮助:)

var result = db.Task.Join(db.EmpTask, t => t.ID, et => et.TaskID, (t, et) => new { t, et })
                    .Select(m => new  
                    {
                        ID = m.t.ID,
                        Title = m.t.Title,
                        XXXX= m.et.XXXX
                    }).GroupBy(m => m.ID, (key, g) => g.OrderByDescending(m => m.EmpTaskId).FirstOrDefault()).ToList();

【讨论】:

    猜你喜欢
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    相关资源
    最近更新 更多