我正在编写一个通过 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 失败时进行内存查询,从而根本不需要这种测试机制?