假设我有C#类Operation
public class Operation
{
public int Id { get; set; }
public string Name { get; set; }
public string Code { get; set; }
public string Description { get; set; }
}
使用EF Core FromSql
,我想将其用于多个查询。一切都好,然后我写选择自己。但是我面临的问题是,有些存储过程无法更改。而且这些存储过程不会返回我的课程所需的所有列。
例如SP_1
返回Id
,Name
和Code
。 SP_2
返回Id
,Name
和Description
。
有什么方法可以将这些属性设置为某些默认值或虚拟值?或者只是忽略这些可选属性,而是从数据库返回它们时映射到类?
答案 0 :(得分:3)
您可以将数据映射到DTO(数据传输对象)。
可以根据您的需求定制此DTO
您可以将要从实体输出的任何字段映射到特殊DTO
此映射可以手动完成,也可以由自动映射器完成
答案 1 :(得分:0)
对于不是表模型的查询,不同的对象将是更好的解决方案。
这些是DTO模型
class obj1
{
Id
Name
Code
}
class obj2
{
Id
Name
Description
}
程序的内容必然会改变。
答案 2 :(得分:0)
据我所知,这是EF / EF Core的缺点。 FromSql不仅需要通用,而且还要求您从查询中获得的响应是1对1(数据库中的模型/表),以便可以正确地映射它。
对于类似的东西,您可以使用ADO.NET(甚至可以是Dapper,但我以前从未使用过)。
编辑:您可以使用EF / EF Core来做到这一点,但这将是丑陋的。您需要为每个要通过FromSql方法获取的响应创建新模型,并将该模型用于数据库中的新表。但是不要那样。
答案 3 :(得分:0)
虽然还不是EF Core的答案,但我对使用Dapper(https://www.nuget.org/packages/Dapper)进行的这种事情感到非常高兴。
这确实意味着要回到使用System.Data.SqlClient或Microsoft.Data.SqlClient,但是它允许您运行自定义SQL查询并将结果映射回对象。所以在您的示例中
using Dapper;
using (var connection = new SqlConnection("")){
connection.Open();
IEnumerable<Operation> operations = connection.Query<Operation>("exec sp_1",
commandType: CommandType.StoredProcedure);
}