实体框架6部分存储过程映射
本文关键字:存储过程 映射 6部 框架 实体 | 更新日期: 2023-09-27 18:28:07
例如,我有一个这样的类:
public class Employee
{
public int Id;
public string Name;
public double Salary;
public DateTime BoD;
}
和一个存储过程,它只返回员工的id
和salary
列,我希望使用实体框架(6或5),如下所示:
执行存储过程,并将其结果映射到Employee
对象,而不使用复杂类型。
请帮帮我。
注:
- 请考虑这个过程会更复杂,我不想使用linq并返回name或Bod
- 这在我的项目中非常重要
- 在nhibernate你可以做到
以下是您需要的:
// Create Two Classes
public class Employee
{
public int Id;
public string Name;
public double Salary;
public DateTime BoD;
}
public class EmployeeIDAndSalary
{
public int Id;
public double Salary;
}
// Create Extension Function
// We need to use Automapper extension library.
// Install Automapper using Nuget Package Manager. And create a class and add this code in it.
namespace Models.Mapper
{
public static class EmployeeMapper
{
public static Employee MapToEmployee(this EmployeeIDAndSalary obj)
{
if (obj != null)
{
Employee model = AutoMapper.TryAutoMap<Employee>(obj);
return model ;
}
return new Employee();
}
public static IEnumerable<Employee> MapToEmployee(this IEnumerable<EmployeeIDAndSalary> obj)
{
if (obj != null)
{
return obj.Select(x => x.ConvertToEmployee()).AsEnumerable();
}
return new List<Models.Employee>();
}
}
public static class AutoMapper
{
static AutoMapper()
{
}
public static T TryAutoMap<T>(object fromObject)
{
try
{
var currentObj = Activator.CreateInstance<T>();
var type = currentObj.GetType();
var propInfo = type.GetProperties();
var _type = fromObject.GetType();
foreach (var item in _type.GetProperties())
{
var prop = propInfo.Where(c => c.Name == item.Name).FirstOrDefault();
if (prop != null)
{
// if (prop.GetType().IsAssignableFrom(item.GetType()))
{
if (IsGenericEnumerable(item.PropertyType))
{
continue;
}
if (prop.GetType() == item.GetType())
{
try
{
prop.SetValue(currentObj, item.GetValue(fromObject, null), null);
}
catch { }
}
}
}
}
return currentObj;
}
catch
{
return default(T);
}
}
private static bool IsClass(Type type)
{
return type.IsClass && !type.IsPrimitive;
}
private static bool IsGenericEnumerable(Type type)
{
if (type.FullName.ToLower().Contains("datamodel") || type.FullName.ToLower().Contains("models") || type.FullName.ToLower().Contains("collection"))
{
return true;
}
return false;
}
}
}
// Use Namespace -> Models.Mapper.EmployeeMapper;
// Execute your procedure using EmployeeIdAndSalary
try
{
var _objList = context.SqlQuery<EmployeeIDAndSalary>("YourProcedureName @SpParameterName", param).ToList().MapToEmployee();
}
catch
{ }
// I think this is all what you need.