我想我从 LinqPad 文档中了解到,它使用与实体框架不同的 linq 到 tsql 转换器。LinqPad 实际上至少在一种情况下更有效!这是详细信息:
LinqPad 生成以下简单的 sql 查询:
SELECT [t0].[personId]
FROM [Person] AS [t0]
WHERE (NOT (([t0].[deleted]) = 1)) AND ([t0].[masterPersonId] = @p0)
ORDER BY [t0].[personId] DESC
对于这个 C# linq 代码:
int? state = null;
string realmId = null;
int? reviewerId = null;
bool? deleted = false;
long? parentPersonId = 1275660779659;
var query = from person in Persons
where
(!deleted.HasValue || person.Deleted == deleted) &&
(!state.HasValue || person.personState == state) &&
(!parentPersonId.HasValue || person.masterPersonId == parentPersonId) &&
(realmId == null || person.realmId == realmId) &&
(reviewerId == null ||(person.reviewerId == reviewerId ))
orderby person.personId descending
select person.personId;
所以你可以看到 LinqPad 翻译了上面的 linq 语句,并在参数值为 null 时删除了无关的 sql。好的!
然而,无论空参数如何,EF总是会生成这个:
SELECT
[Extent1].[personId] AS [personId]
FROM [dbo].[Person] AS [Extent1]
WHERE (@p__linq__0 IS NULL OR [Extent1].[deleted] = @p__linq__1) AND
(@p__linq__2 IS NULL OR [Extent1].[personState] = @p__linq__3) AND
(@p__linq__4 IS NULL OR [Extent1].[masterPersonId] = @p__linq__5) AND
(@p__linq__6 IS NULL OR [Extent1].[realmId] = @p__linq__7) AND
((@p__linq__8 IS NULL) OR ([Extent1].[reviewerId] = @p__linq__9))
它使查询速度变慢。我们希望使用 LinqPad 为 EF 评估生成的 sql,但如果结果不同,显然不会。看起来我们可以针对 LinqPad 中的 EF 连接的自定义程序集。我会尝试一下,看看我们是否至少可以将 sql 查询放在一起。
有人曾经走过这条路或知道我们可以利用的 EF 设置吗?我们正在运行 EF4。
提前致谢。