[c#]实体导航属性 IQueryable 不能转化为一个存储表达式

发布时间: 2017/2/28 21:06:21
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我第一次使用实体框架设计器需要对创建自定义的模型对象从 db 对象开始。 我不想使用 IEnumerable 原因它将查询字段太多。

目标是消除内部选择内此函数︰

using (var db = new dbEntities())
{
   var departments= db.departments
                      .Include(p => p.employee)
                      .Where(...)
                      .Select(p => new CustomDepartmentModel()
                      {
                         ID = p.ID,
                         Employees = p.employee
                                .Select(q => new CustomEmployeeModel()
                                {
                                    ID = q.ID,
                                    Name= q.Name
                                }).ToList()
                      });
   return departments.ToList();
}

通过使用此功能︰

public static IQueryable<CustomEmployeeModel> ToModel(this IQueryable<employee> Employee)
    {
        return Employee.Select(u => new CustomEmployeeModel()
        {
            ID = u.ID,
            Name = u.Name
        });
    }

但我总是收到错误:"LINQ 到实体不识别方法不仅"。

我曾尝试用这些没有运气的方法使用它︰

Employees = p.employee.AsQueryable().ToModel().ToList() //1
Employees = db.Entry(p).Collection(f => f.employee).Query().ToModel().ToList() //2

我想我需要使用这样的事情︰

public static System.Linq.Expressions.Expression<Func<IQueryable<employee>, IQueryable<CustomEmployeeModel>>> ToModel()
    {
        return p => p.Select(u => new CustomEmployeeModel()
        {
            ID = u.ID,
            Name = u.Name
        });
    }

但我真的不明白如何使用它。

解决方法 1:

我想我需要使用这样的事情: [剪断] 但是真的不出如何使用它。

这就是你需要什么,但是你也需要LINQKit以使查询工作。有了它,您的代码将如下所示︰

var toModel = ToModel();

var departments2 = db.departments
    .AsExpandable()
    .Include(p => p.employee)
    .Where(p => true)
    .Select(p => new CustomDepartmentModel()
{
    ID = p.ID,
    Employees = toModel.Invoke(p.employee).ToList()
});
官方微信
官方QQ群
31647020