使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)