我有一个工作得很好的实体,但后来我需要处理另一个来自另一个表的属性.我没有能够创建一个View,所以我想只添加一个[NotMapped]字段,然后使用Context.
Database.SqlQuery来执行我的自定义语句并返回所有正常字段和这个新字段.
换句话说,这样的事情:
public class Employee
{
public int EmployeeId { get; set; }
public string EmployeeName { get; set; }
[NotMapped]
public string CustomerName { get; set; }
}
public List<Employee> GetEmployees()
{
using (MyContext context = new MyContext())
{
return context.Database.SqlQuery<Employee>("select E.EmployeeId, E.EmployeeName, C.CustomerName from Employee E left join Customer C on E.CustomerId = C.CustomerId").ToList();
}
}
是的,不是最好的例子,而是最简单的方法.从我一直在阅读的所有东西,SqlQuery应该忽略属性,所以这应该工作,但我的CustomerName总是返回null(我在Management Studio中运行SQL,它有一个值,就在EF反序列化之后进入我的对象).
我需要做些什么才能让它发挥作用?或者我可以吗? EF改为不允许这样吗?
-shnar
最佳答案 我在使用存储过程进行带有计算字段的选择时遇到了同样的问题.我创建了一个看起来与我的实体完全一样的视图模型而没有db注释.然后在使用视图模型调用我的存储过程后,我选择进入我的实体.所以,使用上面的例子:
public class EmployeeVM
{
public int EmployeeId { get; set; }
public string EmployeeName { get; set; }
public string CustomerName { get; set; }
}
然后你可以打电话:
public List<Employee> GetEmployees()
{
using (MyContext context = new MyContext())
{
return context.Database.SqlQuery<EmployeeVM>("select E.EmployeeId, E.EmployeeName,
C.CustomerName from Employee E left join Customer C on E.CustomerId = C.CustomerId")
.Select(x=> new Employee(){
EmployeeId = x.EmployeeId,
EmployeeName = x.EmployeeName,
CustomerName = x.CustomerName
}).ToList();
}
}
希望这可以帮助.