使用 context.Object.SqlQuery 时返回匿名类型

Posted

技术标签:

【中文标题】使用 context.Object.SqlQuery 时返回匿名类型【英文标题】:Returning an anonymous type when using context.Object.SqlQuery 【发布时间】:2015-06-11 19:30:18 【问题描述】:

假设我想选择一个类别中返回的第一个产品,但我需要直接传递一个 sql 字符串。请注意我是如何指定 context.Products.SqlQuery 的。我认为即使我没有选择查询中的所有产品字段,这也会起作用。我真的必须选择匿名类型然后将其转换为产品吗?

我得到的错误是: 数据读取器与指定的“AppModel.Product”不兼容。类型的成员“InsertDate”在数据读取器中没有同名的对应列。

下面是我的代码:

StringBuilder sql = new StringBuilder();

sql.AppendLine("SELECT Id, ProductName ");
sql.AppendLine("FROM Product ");
sql.AppendLine("WHERE CategoryId=@CategoryId ");
var retval = context.Products.SqlQuery(sql.ToString(),
         new SqlParameter("@CategoryId", categoryId)).FirstOrDefault();

return retval;

【问题讨论】:

【参考方案1】:

Entity Framework 无法根据您的 SQL 语句的结果构造整个 Product 对象,因为您只返回这两个字段。如果你这样做了,它应该可以工作:

sql.AppendLine("Select * ");
sql.AppendLine("FROM Product ");
...

或者如果您手动指定了所有字段。

【讨论】:

如果我不想在此特定查询中选择超过这 2 个字段,我还有哪些选择?我假设我可以以某种方式选择匿名类型,然后创建一个新产品并从匿名类型中填充这两个字段,对吗?如果是这样,你知道我会怎么做吗?我认为它类似于 context.Database.SqlQuery( @JTunney EF 不支持该功能,如果您需要切换到更多围绕手动传递查询的库。例如dapper can do it 感谢您的直接回复。这会很糟糕,因为我正在将旧应用程序中的 DAL 转换为使用实体框架的新应用程序中的 DAL。我正在将大多数函数转换为使用 linq,但有一些函数具有巨大的字符串作为 SQL 查询,我现在没有时间转换。我想我唯一的选择是选择 * 因为我不能使用 EF。 似乎一种可能的替代方法是使用存储过程,它返回一个复杂类型,然后我可以将其转移到我的产品实体。 使用 select * 您可以写入所有字段,但使用默认值,例如:选择 Id、ProductName、null 作为 FullName、null 作为地址等。

以上是关于使用 context.Object.SqlQuery 时返回匿名类型的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)