im首先使用实体框架设计器,我需要从数据库对象开始创建自定义模型对象。我不想使用 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 to Entities 无法识别 ToModel 方法"。
我确实尝试以这些方式使用它,但没有运气:
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
});
}
但我真的不知道如何使用它。
我认为我需要使用这样的东西:[snip]但我真的不知道如何使用它。
这正是您所需要的,但您还需要 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()
});
正在尝试将您的ToModel()
方法转换为 SQL 查询(因为这是 LINQ to Entities 应该执行的操作(,并且它找不到执行此操作的方法,因此您会看到错误。
为了调用ToModel()
您需要已经从数据库中获取信息,这将使任何 LINQ 查询成为 LINQ to Objects 查询,这将完全可以执行您的要求。您可以通过在调用 ToList()
之前调用 ToModel()
来执行此操作。