gpt4 book ai didi

c# - 如何在没有数据库的情况下验证 LINQ 可查询

转载 作者:太空狗 更新时间:2023-10-29 20:38:44 24 4
gpt4 key购买 nike

备注:

我愿意接受有关为这个问题更好的标题的建议。


背景:

对于长期使用 Entity Framework 的任何人,您一定会遇到一个问题,即生成的 IQueryable<T>无法由数据库执行。这源于一个事实 IQueryable<T>除了内存中实现(例如 LINQ to objects)之外,不可能完全实现。诸如 C# 方法调用和使用之类的事情 Single/SingleOrDefault因为非最终查询操作在发送到真实 IQueryProvider 时可能会导致失败(例如 MSSQL 或 Oralce),但要通过单元测试。

我目前知道如何测试这些情况的唯一方法是实际运行该软件。虽然我同意该软件绝对应该作为编写新查询(或一般的新代码)的一部分来完成,但如果可以使用单元测试找到这些类型的错误,那将会很有帮助。导致我来到这里的事件是从我确信开发人员虽然是无辜且安全的更改中发现了一个新错误。更进一步,大量通过的单元测试给人一种错误的自信感。


问题:

是否可以验证 IQueryable<T>生产的产品实际上可以通过单元测试在特定的数据库技术(MSSQL、Oracle 等...)上运行吗?


例子:

可通过 C# 方法调用查询:

var result = (
from a in session.Query<A>
where a.Field == SomeFunction(a)
select a
).ToList();

由于数据库无法执行 C# 代码的明显原因,这将失败。


可单次查询

var result = (
from a in session.Query<A>
where a.Field == session.Query<B>().Single().Field
select a
).ToList();

由于使用单一作为非最终查询操作,这将失败。


还有其他情况,但我认为以上两个示例描述了我想要检测的内容。

最佳答案

有这个查询

var query = 
from a in session.Query<A>
where a.Field == session.Query<B>().Single().Field
select a;

执行

query.ToString();

如果无法将其转换为正确的 SQL 查询,则会抛出异常。

关于c# - 如何在没有数据库的情况下验证 LINQ 可查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37307979/

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