C# LINQ三表内连接查询的条件语法问题排查
LINQ多表内连接问题解决
需求与对应SQL
需要编写LINQ实现三个表的内连接,三个表彼此关联,对应的可正常执行的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实现及报错
编写的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 } // 错误指向此行 equals { c.TableC_Type_Id, c.TableC_Value_Id } into abc where idsList.Contains(abc.TableA_Id) select new { // 此处列出需要获取的各项值 };
报错信息(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
也曾尝试为匿名类型字段添加标签:
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子句,并为匿名类型的匹配字段添加一致的标签,最终可正常运行的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 { 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 { // 此处列出需要获取的各项值 };
内容的提问来源于stack exchange,提问作者Big_Al_Tx
相关产品推荐
相关产品推荐

