我正在尝试运行类似于
的查询var results = MyItem.MyEntitySet.Where( x => x.PropertyB == 0 )
MyEntitySet与MyItem有一个关联,PropertyA。
理想情况下,底层SQL查询应该是
SELECT .. FROM .. WHERE ([t0].[PropertyA] = @p0) AND ([t0].[PropertyB ] = @p1)
因为PropertyA和PropertyB是我正在查询的表的两个主键。
但我的痕迹似乎表明程序首先使用PropertyA查询返回MyEntitySet
,然后使用PropertyB查询以返回var results
。
无论如何,我可以强制Linq在单个SQL语句中使用这两个条件进行查询吗?
答案 0 :(得分:0)
也许,也许不是。生成的SQL确实与您编写LINQ查询的方式相匹配,因此生成的SQL并不令人惊讶。如果您从“MyEntitySet”表示的实体开始,那么,生成的SQL可能会改变。
目前还不清楚您是使用LINQ to SQL还是实体框架。 LINQ to SQL确实将一对多关系表示为“实体集”,而实体框架将关系视为第一类对象,因此一对多关系是一组具有相关实体的关系对象,而不是只是一个实体集。它确实会影响生成的SQL。
另外两个想法......
如果你想对生成的SQL进行那么多的控制,你可能会对LINQ不满意。它并不总是生成最佳SQL(虽然它有时会让你感到惊讶)。另一方面,LINQ的主要优点之一是您开始编写表达数据中真实关系的代码。经典ADO.NET的缺点是您编写有关操纵SQL和处理DataSet和DataTable集合的代码。 LINQ是一种无限清晰,更安全,更强大,更易于维护的代码。一切都是权衡。
其次,随着时间的推移,查询生成可能会变得更好(特别是在实体框架中)。