我需要运行一个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
};
谢谢永顺!
1条答案
按热度按时间o8x7eapl1#
在LINQ中,我们通常使用join ... into(使用
.DefaultIfEmpty()
)来执行LEFT JOIN操作。在查询中,您正在执行INNER JOIN。
因此,您的LINQ查询表达式应如下所示: