我正在编写一个通过 LINQ to SQL 与 MS SQL 数据库配合使用的应用程序。我有时需要进行过滤,有时我的过滤条件太复杂,无法翻译成SQL查询。当我试图使它们可翻译时,我希望我的应用程序至少能够工作,尽管有时很慢。
LINQ to SQL 数据模型隐藏在存储库内,我不想为不同情况提供多个 GetAll 方法重载,也不想知道在上层使用什么重载。因此,我想测试存储库中的表达式是否可翻译,如果不是,则对整个数据集执行内存中查询,而不是在查询实例化时抛出 NotSupportedException。
这就是我现在拥有的:
IQueryable<TEntity> table = GetTable<TEntity>();
IQueryable<TEntity> result;
try
{
result = table.Where(searchExpression);
//this will test our expression
//consuming as little resources as possible (???)
result.FirstOrDefault();
}
catch (NotSupportedException)
{
//trying to perform in-memory search if query could not be constructed
result = table
.AsEnumerable()
.Where(searchExpression.Compile())
.AsQueryable();
}
return result;
searchExpression
是 Expression<Func<TEntity, bool>>
如您所见,我正在使用 FirstOrDefault
尝试实例化查询,如果无法实例化则抛出异常。然而,当表达式良好时,它会执行无用的数据库调用。我可以使用Any
, Count
或其他方法,而且它很可能比 FirstOrDefault
便宜一点。 ,但我想到的所有方法仍然需要昂贵的数据库访问,而我所需要的只是测试我的表达。
是否有其他方法可以在不调用实际数据库的情况下判断我的表达式是“好”还是“坏”?
更新:
或者,更一般地说,有没有办法告诉 LINQ 在构造 SQL 失败时进行内存中查询,这样就根本不需要这种测试机制了?
最佳答案
而不是
result.FirstOrDefault();
使用就足够了
string sqlCommand = dataContext.GetCommand(result).CommandText;
?
如果表达式没有生成有效的 Sql,则应该抛出 NotSupportedException,但它实际上不会执行 sqlCommand。
关于linq - 测试 LINQ to SQL 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6842072/