我正在尝试将ASP.NET项目转换为Entity框架。如何将以下查询重写为其LINQ等效项?
SELECT {Table1 objects}
FROM [Table1] tb1
INNER JOIN [Table2] tb2
ON tb1.Table1ID = tb2.fk_Table1ID
WHERE tb2.fk_attrib1 = '123' AND tb2.fk_attrb2 = '345'
ORDER BY tb1.attrib1
结果是Table1
个对象的集合。
这里Table1
和Table2
对应于ADO.NET实体框架的对象System.Data.Objects.ObjectSet
。
答案 0 :(得分:2)
这样的事情:
context.Table1
.Where( o => o.Table2s.Any( o2 =>
o2.fk_attrib1 == '123' &&
o2.fk_attrib2 == '345' ) )
.OrderBy( o => o.attrib1 )
.ToList();
BTW,LINQPad非常适合尝试L2E查询。
答案 1 :(得分:2)
var results = from tb1 in Context.Table1
join tb2 in Context.Table2 on tb1.Table1ID == tb2.fk_Table1ID
where tb2.fk_attrib1 == "123" && tb2.fk_attrb2 == "345"
orderby tb1.attrib1
select tb1;
答案 2 :(得分:1)
这应该对你有所帮助。我认为主要问题在于JOIN
子句 - 在EF
中你可以使用NavigationProperties
并且不需要担心加入表格 - EF
会考虑到你。
此外,您正尝试从已连接的表中过滤列。您可以使用Any
方法查找连接到Table1
的所有Table2
元素,其中这些元素具有某些属性/列。您还应熟悉All
方法,因为它可能对您有用。
from t1 in context.Table1
where t1.Table2s.Any(t2.fk_attrib1 == "123" && t2 => t2.fk_attrb2 == "345")
order by t1.attrib1
select t1;
编辑:
我假设1:n
和Table1
之间存在Table2
关系,导致NavigationProperty
对象中的可枚举集合为Table1
。
EDIT2:
修复了代码中的错误 - 未注意到这两个属性均来自Table2
而非Table1
答案 3 :(得分:0)
应该是这样的:
var result = (from tb1 in Table1
from tb2 in Table2
where tb1.Key == tb2.Key &&
tb2.fk_attrib1 = '123' &&
tb2.fk_attrb2 = '345'
select ione).OrderBy(p=>p.attrib1);
希望这有帮助。