实体框架核心 - 映射原始查询(没有ID字段的DTO类),标量

时间:2016-08-31 20:29:31

标签: c# entity-framework stored-procedures dbcontext entity-framework-core

我在ASPNETCore上使用EFCore,一切看起来都不错,但我发现这两种情况:

  1. 我创建了一个不是数据库中的表的DTO类,这些类将映射原始SQL查询或过程。
  2. Context Here!

    Class DTO

    所以我需要在列表类DTO中映射SQL过程的结果,我的问题是,如果EFCore要求所有类的DTO都有一个名为ID的字段?,因为我的过程不一定具有field?,有一种方法可以指定EFCore我的查询不需要映射任何名为ID的字段吗?

    rawQuery

    Repository

    1. 同样,映射标量值或原始SQL查询或过程的唯一结果的正确方法是什么?
    2. 非常感谢您的支持。

1 个答案:

答案 0 :(得分:0)

这是一个可以解决您需求的课程。

用法var listOfEntity = DatabaseServices.ExecuteStoredProcedure(存储过程名称,SqlParameter列表)

public class DatabaseServices:IDatabaseServices     {         private readonly ApplicationDbContext _applicationDbContext;

    public DatabaseServices(ApplicationDbContext applicationDbContext)
    {
        _applicationDbContext = applicationDbContext;
    }

    public List<T> ExecuteStoreProcedure<T>(string storedProcedure, List<SqlParameter> parameters) where T : new()
    {
        using (var cmd = _applicationDbContext.Database.GetDbConnection().CreateCommand())
        {
            cmd.CommandText = storedProcedure;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandTimeout = 300;

            // set some parameters of the stored procedure
            foreach (var parameter in parameters)
            {
                parameter.Value = parameter.Value ?? DBNull.Value;
                cmd.Parameters.Add(parameter);
            }

            if (cmd.Connection.State != ConnectionState.Open)
                cmd.Connection.Open();

            using (var dataReader = cmd.ExecuteReader())
            {
                var test = DataReaderMapToList<T>(dataReader);
                return test;
            }
        }
    }

    private static List<T> DataReaderMapToList<T>(DbDataReader dr)
    {
        List<T> list = new List<T>();

        if (dr.HasRows)
        {
            while (dr.Read())
            {
                var obj = Activator.CreateInstance<T>();
                foreach (PropertyInfo prop in obj.GetType().GetProperties())
                {
                    if (!Equals(dr[prop.Name], DBNull.Value))
                    {
                        prop.SetValue(obj, dr[prop.Name], null);
                    }
                }
                list.Add(obj);
            }
            return list;
        }
        return new List<T>();
    }
}