實體框架核心 - 映射原始查詢(沒有ID字段的DTO類),標量

c# dbcontext entity-framework entity-framework-core stored-procedures

我在ASPNETCore中使用EFCore,一切看起來都很棒,但我發現這兩種情況:

  1. 我創建了一個不是數據庫中的表的DTO類,這些類將映射原始SQL查詢或過程。

語境在這裡!

DTO類

所以我需要在列表類DTO中映射SQL過程的結果,我的問題是,如果EFCore要求所有類的DTO都有一個名為ID?的字段,因為我的過程不一定有那個字段嗎?有一種方法可以指定EFCore我的查詢不需要映射任何名為ID的字段嗎?

rawQuery

知識庫

  1. 同樣,映射標量值或原始SQL查詢或過程的唯一結果的正確方法是什麼?

非常感謝您的支持。

熱門答案

這是一個可以解決您需求的課程。

用法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>();
    }
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow