我有这张表:
我有TableA和TableC的实体,但不是TableB。在实体TableA中,我有一个集合ICOllection,在tableC中我有一个集合Icollection。
我想获得TableA中具有TableC寄存器的所有寄存器,其中TableC的ID = 5。
在T-SQL中应该是:
select * from TableA, TableAC, TableC
where TableA.IDTableA = TableAC.IDTableA
and TableC.IDTableC = TableAC.IDTableB
and TableA.IDTable = 5;
如何使用lambda表达式执行此查询?语法查询也是另一种选择。
感谢。
答案 0 :(得分:2)
我认为实体框架在生成entites时省略了关系表AC,而是生成并填充ICollection属性。从本质上讲,它使得多对多关系不可见。要从TableA获取与TableC = 5有关系的所有实体,您可以直接对此ICollection进行LINQ查询:
from ta in TableA
where ta.TableC.Any(tc => tc.Id == 5)
select ta;
更新: 正如Tough Coder所说 - 在测试linq查询时,LINQPad确实是你的朋友。更不用说这是一个非常宝贵的代码暂存器(只需测试小样本而不需要启动一个全新的VS项目)。我刚刚制作了一个完整的示例来说明您需要的实体关系和linq查询:
void Main()
{
List<TableA> ta = new List<TableA>();
var ta1 = new TableA() { Id = 1 };
var ta2 = new TableA() { Id = 2 };
var ta3 = new TableA() { Id = 3 };
ta.Add(ta1);
ta.Add(ta2);
ta.Add(ta3);
var tc1 = new TableC() { Id = 1 };
var tc2 = new TableC() { Id = 2 };
var tc3 = new TableC() { Id = 3 };
ta1.TableCs.Add(tc1);
ta1.TableCs.Add(tc3);
ta2.TableCs.Add(tc1);
ta3.TableCs.Add(tc2);
ta3.TableCs.Add(tc3);
var res = from t in ta
where t.TableCs.Any(tc => tc.Id == 3)
select t.Id;
foreach (var t in res)
{
Console.WriteLine(t);
}
}
public class TableA
{
public int Id {get;set;}
public List<TableC> TableCs{get;set;}
public TableA()
{
TableCs = new List<TableC>();
}
}
public class TableC
{
public int Id {get;set;}
public List<TableA> TableAs{get;set;}
public TableC()
{
TableAs = new List<TableA>();
}
}
答案 1 :(得分:1)
很长一段时间你可以这样做:
from c in db.TableA
where c.TableC.Any(tc => tc.Id == 5)
select c;
如果要在SQL中检查此代码,可以使用LINQPad。它将在SQL中显示此Linq查询。
对于另一种解决方案,您可以使用ExecuteStoreQuery发送SQL查询。如:
db.ExecuteStoreQuery<Results_Class>("select * from TableA, TableAC, TableC
where TableA.IDTableA = TableAC.IDTableA
and TableC.IDTableC = TableAC.IDTableB
and TableA.IDTable = 5;");
对于此解决方案,您必须创建一个Results_Class类。