【发布时间】:2020-10-12 15:18:35
【问题描述】:
我正在实施一些通用的解决方案来从数据库中查询 ID。我所知道的,例如,给定一个表A,它有一个具有整数类型的列Id。不知道是uint32还是int64等
我想使用DbContext.Database.SqlQuery 查询ID 的最大值,但是我不能让它以弱类型的方式工作。所以我总是必须提供一个强大的元素类型,基本上我不会喜欢它,因为它可能是int 或long。
如果我像.SqlQuery<object> 一样运行它,那么在尝试使用Convert.ToInt64 将其转换为例如long 时会遇到异常,说System.Object 不能转换为该类型。看来EF有点误会我了。
即使实际底层类型是Int32,并且我尝试查询long,我也会收到一个异常,指出我无法将Int32 转换为long,这对我来说完全没有意义。
我怎样才能获得一个弱类型的查询结果,我可以将其转换为我想要的任何内容?
【问题讨论】:
-
你能不能把它转换成 varchar 然后用 C# 解析它?
-
I'd like to query the maximum of the ID为什么?您是否尝试使用错误的 MAX+1 算法生成新 ID?这可能会产生重复的 ID,或者更糟的是,如果最后的记录被删除,则会关联不相关的记录。为什么不使用 EF 的内置身份生成机制? -
顺便说一句
SqlQuery可以使用任何类型,但是如果您只想返回单个值,则不应该使用 ORM。可以使用普通的 ADO.NET 查询或例如 Dapper 来执行该查询。只是不要使用 MAX+1。您可以在 EF 中指定备用 ID 生成策略。如果您想提前知道 ID,更好的解决方案是使用 SEQUENCE -
只是
.SqlQuery<long>(...)DB 类型与 C# 类型不同,所以 对于查询 重要的是,要有一个足够大的目标类型来保存结果 -
@grek40 感谢您的评论,是的,这就是为什么我很惊讶
long不适合int。
标签: c# entity-framework entity-framework-6