Entity Framework SqlQuery Select LONG RAW 成字节数组
Entity Framework SqlQuery Select LONG RAW into byte array
我正在 Entity Framework 中执行查询,将 select LONG RAW 数据转换为字节数组。
var result = db.Database.SqlQuery<byte[]>("SELECT MESSAGE FROM FOCUS.ENTRIES");
var list = await result.ToListAsync();
当我执行这段代码时,我得到了一个字节数组列表,但它们都是空的。在数据库中它们不为空。
消息 table 看起来像这样:
CREATE TABLE "FOCUS"."ENTRY"
( "PRIMKEY" NUMBER,
"TITLE" VARCHAR2,
"MESSAGE" LONG RAW
);
我正在使用 ODP.NET,托管驱动程序作为数据库提供程序。
我猜是映射问题,但我想不通。
欢迎任何帮助。
谢谢!
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 文档的一些注释,https://docs.oracle.com/html/A96160_01/features.htm
When an OracleDataReader is created containing LONG or LONG RAW types,
OracleDataReader defers the fetch of the LONG or LONG RAW column data.
The initial number of characters for LONG or bytes for LONG RAW
fetched on the client side depends on the InitialLONGFetchSize
property of the OracleCommand. By default, InitialLONGFetchSize is 0.
ODP.NET does not support CommandBehavior.SequentialAccess. Therefore,
LONG and LONG RAW data can be fetched in a random fashion.
To obtain data beyond InitialLONGFetchSize bytes or characters, a
primary key column must be provided in the list of selected columns.
The requested data is fetched from the database when the appropriate
typed accessor method (GetOracleString for LONG or GetOracleBinary for
LONG RAW) is called on the OracleDataReader object.
所以尝试添加主键,看看是否可以检索数据。否则,如果您无法更改配置,则必须跳过 SqlQuery
并直接使用 ODP.NET 来获取。或者您必须创建 OracleConnection
的实例并将其作为参数传递给 DbContext
的构造函数。
我正在 Entity Framework 中执行查询,将 select LONG RAW 数据转换为字节数组。
var result = db.Database.SqlQuery<byte[]>("SELECT MESSAGE FROM FOCUS.ENTRIES");
var list = await result.ToListAsync();
当我执行这段代码时,我得到了一个字节数组列表,但它们都是空的。在数据库中它们不为空。
消息 table 看起来像这样:
CREATE TABLE "FOCUS"."ENTRY"
( "PRIMKEY" NUMBER,
"TITLE" VARCHAR2,
"MESSAGE" LONG RAW
);
我正在使用 ODP.NET,托管驱动程序作为数据库提供程序。
我猜是映射问题,但我想不通。
欢迎任何帮助。
谢谢!
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 文档的一些注释,https://docs.oracle.com/html/A96160_01/features.htm
When an OracleDataReader is created containing LONG or LONG RAW types, OracleDataReader defers the fetch of the LONG or LONG RAW column data. The initial number of characters for LONG or bytes for LONG RAW fetched on the client side depends on the InitialLONGFetchSize property of the OracleCommand. By default, InitialLONGFetchSize is 0.
ODP.NET does not support CommandBehavior.SequentialAccess. Therefore, LONG and LONG RAW data can be fetched in a random fashion.
To obtain data beyond InitialLONGFetchSize bytes or characters, a primary key column must be provided in the list of selected columns. The requested data is fetched from the database when the appropriate typed accessor method (GetOracleString for LONG or GetOracleBinary for LONG RAW) is called on the OracleDataReader object.
所以尝试添加主键,看看是否可以检索数据。否则,如果您无法更改配置,则必须跳过 SqlQuery
并直接使用 ODP.NET 来获取。或者您必须创建 OracleConnection
的实例并将其作为参数传递给 DbContext
的构造函数。