我们正在使用EF进行数据访问,我们有一个像这样的查询:
我的问题是,EF是否能够根据已编译的表达式构建正确的查询?
举个例子,如果我的表格是:
这会在EF中翻译成什么:
Expression<TTable, bool> expression = CreateSomeExpression();
var filter = finalExpression.Compile();
var results = db.t_Table.Where(filter).Select(x=>...);
我的问题是,EF是否能够根据已编译的表达式构建正确的查询?
举个例子,如果我的表格是:
t_Table
( key int,
value_1 varchar(30),
value_2 varchar(30)
)
需要编译的表达式是:
p => p.value_1 = 100
这会在EF中翻译成什么:
select * from t_Table where value_1 = 100
或者它会被翻译成
select * from t_Table
在结果上执行linq查询之后,是否有一种方法可以检查EF在数据库上实际调用的SQL查询语句?
非常感谢您提前的帮助。
更新
虽然被接受的答案是100%正确的(因此是被接受的答案),但解决我的问题的方法是简单地删除编译。 删除后,正确的SQL查询具有正确的where clause
。
results.ToString()
应该给你SQL。System.Linq.Enumerable+WhereSelectEnumerableIterator
2[CLASS_NAME, RESULT_CLASS_NAME]`(其中class_name是表类名,result_classname是select返回类型的类型) - khaToString()
生成了System.Linq.Enumerable+WhereSelectEnumerableIterator...
,那么这清楚地表明 EF 将在内存中执行查询的一部分。预期输出是一个 SQL 查询字符串 (SELECT ...
)。@Kiril Shlenskiy 的答案解释了这一点。只需不要使用.Compile()
,而是使用表达式即可。 - Ivan Stoev