0

im으로 변환 할 수 없습니다. 먼저 Entity Framework 디자이너를 사용하여 db 개체에서 시작하는 사용자 지정 모델 개체를 만들어야합니다. 너무 많은 필드를 쿼리하므로 IEnumerable을 사용하고 싶지 않습니다.엔티티 탐색 속성 IQueryable은 저장소 표현식

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

하지만 항상 오류 얻을 : "엔티티에 LINQ는 인식하지 않습니다이 기능을 사용하여

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

:

목표는이 함수 내에서 내부 선택을 제거하는 것입니다 메소드 ToModel ".

내가 운이없이 이러한 방법을 사용하려고 않았다

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 
     }); 
    } 

하지만 난 정말 방법을 알아낼 수 없습니다

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

가 나는 이런 식으로 뭔가를 사용할 필요가 있다고 생각 그것을 사용하십시오.

답변

1

I think that I need to use something like this: [snip] but I really can't figure out how to use it.

. 그것으로, 당신의 코드는 다음과 같습니다

난 그냥 외부 방법으로 내부 선택을 이동하려는
+0

큰 프로젝트에서 LINQKit을 사용하는 것이 안전할까요? 엔티티 패키지 업데이트로 코드가 손상되지 않도록해야합니다. 확장 방법은 어떻습니까? 이 방법으로 호출 할 수 있다고 생각합니까? p.employee.ToModel()? – Simone

+0

@Simone LINQKit은 EF와 관련이 없으며 모든 IQueryable과 작동하므로 모든 버전의 EF에서 작동해야합니다. 그리고 직접 확장 메서드를 사용하여이 작업을 수행하는 방법을 알지 못합니다. LINQKit은'Invoke()'의 호출을 찾아서 처리하지만'ToModel()'을 처리해야한다는 것을 모릅니다. – svick

0

문제는 LINQ to Entities가 ToModel() 메서드를 SQL 쿼리로 변환하려고하기 때문에 (LINQ to Entities가 수행해야하는 작업이므로) 오류가 발생하여 오류가 발생하므로 오류가 발생합니다. 너보고있어.

ToModel()에 전화하기 위해서는 데이터베이스에서 정보를 가져와야합니다. 그러면 LINQ 쿼리가 LINQ to Objects 쿼리로 바뀌어 사용자가 할 수있는 것 이상의 기능을 수행하게됩니다. 묻고. 전화 번호 ToModel()에 전화하기 전에 ToList()으로 전화하여이 작업을 수행 할 수 있습니다. 정확하게 당신이 필요하지만 당신은 또한 쿼리 작업을 할 LINQKit 필요

+0

, 나는 여전히 SQL 문에 내부 선택을 번역 할 내가 (싶어 사용 ToList을하지

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() }); 
) 그렇지 않으면 다른 매개 변수도 쿼리합니다. – Simone

+0

LINQ to Entities가 허용되지 않는 것을 제외하고는. 내부 선택을 유지하거나 먼저 ToList를 호출해야합니다. – IronMan84