实体框架SqlQuery选择LONG RAW为字节数组

时间:2017-01-27 08:46:34

标签: c# .net entity-framework oracle11g

我正在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,托管驱动程序作为数据库提供程序。

我想这是一个映射问题,但我无法弄清楚。

欢迎任何帮助。

谢谢!

1 个答案:

答案 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的构造函数中。