gpt4 book ai didi

linq - 测试 LINQ to SQL 表达式

转载 作者:行者123 更新时间:2023-12-04 06:19:01 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com