我正在Entity Framework中执行查询,以选择LONG RAW数据为字节数组。
var result = db.Database.SqlQuery<byte[]>("SELECT MESSAGE FROM FOCUS.ENTRIES");
var list = await result.ToListAsync();
当我执行此代码时,我得到一个字节数组列表,但所有这些都是空的。在数据库中,它们不是空的。
MESSAGE表如下所示:
CREATE TABLE "FOCUS"."ENTRY"
( "PRIMKEY" NUMBER,
"TITLE" VARCHAR2,
"MESSAGE" LONG RAW
);
我使用ODP.NET,托管驱动程序作为数据库提供程序。
我想这是一个映射问题,但我无法弄清楚。
欢迎任何帮助。
谢谢!
答案 0 :(得分:2)
SqlQuery期望class
的成员名称等同于SQL列。
public class MessageInfo{
public byte[] Message;
}
var result = await db.Database
.SqlQuery<MessageInfo>("SELECT MESSAGE FROM FOCUS.ENTRIES")
.ToListAsync();
var list = result.Select( x => x.Message );
Oracle Docs的一些注释,https://docs.oracle.com/html/A96160_01/features.htm
创建包含LONG或LONG RAW类型的OracleDataReader时, OracleDataReader推迟获取LONG或LONG RAW列数据。 LONG RAW的LONG或字节的初始字符数 在客户端获取取决于InitialLONGFetchSize OracleCommand的属性。默认情况下,InitialLONGFetchSize为0。
ODP.NET不支持CommandBehavior.SequentialAccess。因此, 可以随机获取LONG和LONG RAW数据。
要获取InitialLONGFetchSize字节或字符之外的数据,a 必须在所选列的列表中提供主键列。 在适当的时候从数据库中获取所请求的数据 typed accessor方法(GetOracleString for LONG或GetOracleBinary for LONG RAW)在OracleDataReader对象上调用。
因此,尝试添加主键,看看是否可以检索数据。否则,如果无法更改配置,则必须跳过SqlQuery
并直接使用ODP.NET进行提取。或者您必须创建OracleConnection
的实例并将其作为参数传递到DbContext
的构造函数中。