【问题标题】:simple join of three tables in LINQLINQ中三个表的简单连接
【发布时间】:2014-12-15 18:23:32
【问题描述】:

我不正确理解 linq。我不知道为什么。

我有三张桌子。

1)TillTable

  tillId,    tillName
      1             w1
      2             w2
      3             w3
      4             w4

2)直到部门

   tillDeptId,  tillId,  deptId,  isPart
        1        1          5         1
        2        1          7         0
        3        1          8         0
        4        1          9         0
        5        2          5         0
         6       2           7         0
         7       2           8         0
         8       2           9         0
         9       3           5          0
        10      3           7          1
        11       3          8          0
         12      3           9         0         
        13       4           5         0 
        14       4           7         0
        15        4          9         0      so on.... 

3) 部门表

   deptId,         deptName
       5               Science 
       7               Commerce 
       8               history
       9               English        so on.... 

现在使用 linq 或 lambda exp 我想显示以下结果,

    tillId,   tillName,     deptName
      1          w1              science 
      2          w2              no dept
      3          w3              commerce
      4          w4              no dept     so on... 

我希望 linq 掌握它该死的简单任务....

帮我解决....

如果 isPart 列为 1,则结果集中的 deptName 应显示 else 'no dept' ....
关联表有tillId的多个条目..... 它的要求只能严格遵循这种情况.....

我希望它的 clr ......

【问题讨论】:

  • 那么到目前为止你尝试过什么?如果有人只是给你答案,你学到的东西几乎不会像你解释你尝试过的东西和发生了什么一样多,我们可以从那里引导你找到正确的方法。
  • 我尝试了很多东西。但我只得到具有“无空”值的结果集...我不知道 abt linq 连接语法..我现在有笔记本电脑,否则我会告诉你我到目前为止所做的事情。我正在用手机写这一切,所以不能写所有的东西。对不起.....
  • 那么我建议你删除这个问题,直到你能够做好它。 (我还建议你用完整的文字写出正确的大写和标点符号。这样写的问题更容易阅读。)
  • 我现在有限制。没有人想在堆栈溢出中使用移动设备编写查询或询问查询,因为它变得非常难以朝着正确的方向前进......我仍然试图让它非常清楚......
  • 所以不要……等到你在笔记本电脑前才提出问题。使用移动设备并不是问一个糟糕的问题而没有任何迹象表明您已经尝试过什么的好借口。

标签: linq linq-to-sql lambda


【解决方案1】:

试试这个:-

var result = (from tt in db.tillTables
              join td in db.tillDepts
              on tt.tillId equals td.tillId
              join dt in db.departmentTable
              on td.deptid equals dt.deptId
              select new
                   {
                       tillId = tt.tillId,
                       tillName = tt.tillName,
                       deptName = td.isPart == 1 ? dt.deptName : null
                   }).GroupBy(x => x.tillId)
                     .Select(x =>
                             {
                              var orderedDeptRecord = x.OrderByDescending(z => z.deptName).FirstOrDefault();
                              return new
                              {
                                  tillId = x.Key,
                                  tillName = orderedDeptRecord.tillName,
                                  deptName = orderedDeptRecord.deptName
                              };
                    });

【讨论】:

  • @micronyks - 它为我工作。 “我想要的方式”是什么意思?你能解释一下你的“方式”吗?
  • 请立即检查。在你的情况下,它返回这么多行。但实际上我希望得到如上所示的结果集.....如果 isPart 为 1,它的 sohuld 映射部门名称.....我希望你明白我想要什么.....
  • @micronyks - 你的数据结构很混乱,tillDeptId 是干什么用的?那是那个表的主键吗?
  • 是的,直到 DeptId 是 PK。我知道它的复杂性。但我必须找到一个答案。这是 else 开发者犯的一个大错误....
  • 你有什么解决办法吗?
【解决方案2】:

外连接单条记录,则deptName的外键是带有三元运算符的select子句(翻译为“case”)

from t in TillTable
join tds in TillDepartment on new { t.tillId,isPart=1}
                       equals new { td.tillId, isPart } into tdOuter
from td in tdOuter.DefaultIfEmpty().Take(1)
select new { t.tillId, t.tillName, 
        deptName=((td==null)? "no dept" :
            (from dt in departmentTable 
            where dt.deptId == td.deptId
            select deptName ) ) }

【讨论】:

    猜你喜欢
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多