C# LINQ查询三向联接中的条件问题

uxhixvfz  于 2022-12-15  发布在  C#
关注(0)|答案(1)|浏览(164)

我需要运行一个LINQ查询,执行一个3向内部连接,其中所有3个表都链接到另外2个表。但是,我在获取连接条件的正确语法时遇到了问题。如果我用SQL编写它,它将如下所示:

SELECT * FROM [Table1]
JOIN [Table2]
    ON [Table1_Id] = [Table2_T1_Id]
JOIN [Table3]
    ON [Table1_Type_Id] = [Table3_Type_Id]
    AND [Table2_Value_Id] = [Table3_Value_Id]
WHERE [Table1_Id] IN idsList
ORDER BY[Table1_Id], [Table2_Id];

在数据库中正确地运行这个函数可以正常工作。但是当我尝试用LINQ格式编写它时,如下所示:

var results = from a in context.TableA
            join b in context.TableB
            on a.TableA_Id equals b.TableB_TA_Id into ab
            join c in context.TableC
            on new { a.TableA_Type_Id, ab.TableB_Value_Id }        <-- Errors point to this line
            equals { c.TableC_Type_Id, c.TableC_Value_Id } into abc
            where idsList.Contains(abc.TableA_Id)
            select new
            {
              // various values to retrieve listed here
            };

我收到以下“CS1061”错误(参考上面指示的行):

'IEnumerable<TableB>' does not contain a definition for 'TableB_Value_Id' and no accessible extension
    method 'TableB_Value_Id' accepting a first argument of type 'IEnumerable<TableB>' could be found
    (are you missing a using directive or an assembly reference?)

如果我将有问题的行改为:

on new { a.TableA_Type_Id, b.TableB_Value_Id }

我得到这个错误:

The name 'b' does not exist in the current context

我还在标准前面加上了'labels?'(我不知道该怎么称呼它们)'j'和'k',如下所示:

on new { j = a.TableA_Type_Id, k = b.TableB_Value_Id }
equals { j = c.TableC_Type_Id, k = c.TableC_Value_Id } into abc

并尝试了两种方法(如上所述),但这绝对没有任何区别。我错过了什么?

编辑--找到的解决方案:

我忘了在我的第一篇文章中提到,我的原始代码没有“into xx”子句,我看到了不同的错误信息。在尝试解决它们时,我添加了“into xx”子句,除了一个错误之外,所有错误都消失了。感谢永顺的回答,我删除了“into xx”子句,并尝试使用“labels”,最终成功了:

var results = from a in context.TableA
            join b in context.TableB
            on a.TableA_Id equals b.TableB_TA_Id
            join c in context.TableC
            on new { j = a.TableA_Type_Id, k = b.TableB_Value_Id }
            equals new { j = c.TableC_Type_Id, k = c.TableC_Value_Id }
            where idsList.Contains(a.TableA_Id)
            select new
            {
              // various values to retrieve listed here
            };

谢谢永顺!

o8x7eapl

o8x7eapl1#

在LINQ中,我们通常使用join ... into(使用.DefaultIfEmpty())来执行LEFT JOIN操作。
在查询中,您正在执行INNER JOIN。
因此,您的LINQ查询表达式应如下所示:

var results = from a in context.TableA
            join b in context.TableB
            on a.TableA_Id equals b.TableB_TA_Id
            join c in context.TableC
            on new { a.TableA_Type_Id, b.TableB_Value_Id }
            equals new { c.TableC_Type_Id, c.TableC_Value_Id }
            where idsList.Contains(a.TableA_Id)
            select new
            {
              // various values to retreive listed here
            };

相关问题