linq - 测试 LINQ to SQL 表达式

标签 linq linq-to-sql linq-expressions

我正在编写一个通过 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;

searchExpressionExpression<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/

相关文章:

c# - 使用 LINQ to SQL 散列密码数据库

c# - 计数子记录,如果为空则显示零

c# - 使用 LINQ 的动态表达式。如何找到厨房?

c# - 为什么要引用 LambdaExpression?

c# - 如何克服从 IEnumerable<T> 创建 List<T> 的开销?

c# - 为什么 Entity Framework 在 SELECT 上生成 JOIN

linq - .NET 3.5 Linq 数据源和连接

c# - 如何将适用于整数的通用表达式树代码应用于枚举(例如,如何使 Expression.PostIncrementAssign() 适用于枚举?)?

c# - LINQ 动态分组

linq - 删除两个 List<string> 集合之间的重叠项目