【发布时间】:2018-06-26 08:02:02
【问题描述】:
我有一个表,其中一列是二进制的,另一列是浮动的。我需要使用 SQL 选择以下内容
SELECT ISNULL(myBinary, myFloat) FROM table
这行得通,我得到一列包含所有二进制文件
0x3F800000
0xE5C13DBAB611123B47A7
0x9946C3BA9946C3BA9946
0xDE0E1D3C8B7A143C6DB7
0x3F800000
等等
现在我想使用 Linq to Entities 进行此查询,但是我找不到可以编译的代码
context.table.select(s => new MyObject()
{
Result = s.myBinary ?? s.myFloat // <--- '??' operator cannot be applied to operands of type 'byte[]' and 'float'
});
class MyObject { public Object Result {get; set;} }
我如何获得这些值? BitConverter 也不起作用(在浮动上)
更新
我为什么要问:所以如果我要分别选择两列,我会得到更多的执行时间
set statistics time on
SELECT TOP (5000) ISNULL([x], [y])
FROM [table];
set statistics time off
set statistics time on
SELECT TOP (5000) [x], [y]
FROM [table];
set statistics time off
yields(即使多次执行,也总是差不多)
(5000 rows affected)
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 7 ms.
(5000 rows affected)
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 113 ms.
注意:在一个评论中,我写了因子 40,这是使用另一种测量方法。统计时间大约是 10 倍。
如果我增加行数,我会得到
(50000 rows affected)
SQL Server Execution Times:
CPU time = 47 ms, elapsed time = 820 ms. (with ISNULL)
(50000 rows affected)
SQL Server Execution Times:
CPU time = 16 ms, elapsed time = 1365 ms.
如果行数较少(大约 1000 或更少),执行时间无法平均测量,因此大约为 1 毫秒。但是:我预计每个查询大约有 5000 到 10000 行。
【问题讨论】:
-
试试投射吧?例如
Result = (object)s.myBinary ?? (object)s.myFloat。我同意 DavidG - 你可能不应该这样做。 -
您希望您的应用如何处理
float或byte[]?你留下了可怕的东西,比如反射。为什么不只返回两个值并使用二进制列,除非它为空? -
嗯...我得到 无法将类型“System.Byte[]”转换为类型“System.Object”。 LINQ to Entities 仅支持转换 EDM 基元或枚举类型。
-
@DavidG 性能有问题。阅读两者都会产生过多的流量。始终读取浮点值且始终不为空。但我只需要在二进制条目为空的情况下。
-
可能的解决方案:创建一个执行
SELECT ISNULL(myBinary, myFloat) FROM table的视图并将其映射到 EF
标签: c# entity-framework linq asp.net-web-api