2017-01-23 8 views
2

Linq 쿼리에서 실행해야하는 함수에서 결과를 얻어야합니다. 나는이 오류가 발생할 그리드하지만 실행 시간이 결과 바인드 :LinQ의 결과 함수를 스토어 식으로 변환하지 않고 가져 오기

LINQ to Entities does not recognize the method 'System.String GetName(System.Type, System.Object)' method, and this method cannot be translated into a store expression.

이 내 코드입니다 :

public IQueryable GetForRah_CapacityList(XQueryParam param) 
{ 
    var result = (from x in Data() 
        select new 
        { 
         Rah_CapacityId = x.Rah_CapacityId, 
         Rah_CapacityName = x.Rah_CapacityName, 
         Rah_St = Enum.GetName(typeof(Domain.Enums.CapacityState), x.Rah_St), 
         Rah_LinesId = x.Rah_LinesId 
        }).OrderByDescending(o => new { o.Rah_CapacityId }); 
    return result; 
} 

답변

2

LINQ가 Enum.GetName을 sql로 변환하는 방법을 모르기 때문에 Linq-To-Entities에서이 방법을 사용할 수 없습니다. 그래서 AsEnumerable를 사용하여 Linq에 - 투 - 객체와 메모리에 실행하고 쿼리 사용 AsQueryableAsQueryable 원하는 얻을 :

을 그러니 :

var result = Data() 
      .OrderBy(x=> x.CapacityId) 
      .AsEnumerable() 
      .Select(x => new 
      { 
        Rah_CapacityId = x.Rah_CapacityId, 
        Rah_CapacityName = x.Rah_CapacityName, 
        Rah_St = Enum.GetName(typeof(Domain.Enums.CapacityState), x.Rah_St), 
        Rah_LinesId = x.Rah_LinesId 
      }) 
      .AsQueryable(); 

당신이 AsEnumerable를 사용하기 전에 먼저 OrderBy를 사용한다 데이터베이스 정렬 성능의 이점. Where도 마찬가지이며, 항상 AsEnumerable (또는 ToList) 전에 수행하십시오.

+0

코드가 맞습니까? –

+0

컴파일 할 수 없습니다. –

+0

AsEnumerable을 사용할 수 없습니다. IQueryable 결과를 원합니다. –

6
GetName는 T-SQL로 변환 할 수없는

, Linq에 엔티티가 나오지 않았어에 ' 그것을 인식하지 못한다. 데이터가로드 된 후 메모리에 이미 데이터에 더 이상의 동작 (예 선택 등), 개체 Linq를 사용하여 수행된다 .ToList()으로

var result = (from x in Data().AsEnumerable() 
       select new 
       { 
        Rah_CapacityId = x.Rah_CapacityId, 
        Rah_CapacityName = x.Rah_CapacityName, 
        Rah_St = Enum.GetName(typeof(Domain.Enums.CapacityState), x.Rah_St), 
        Rah_LinesId = x.Rah_LinesId 
       }).OrderByDescending(o => new { o.Rah_CapacityId }); 

: 사용자는 아래의 코드를 변경할 수있다.

편집는 : 조회가 익명 형식IOrderedEnumerable있는 동안 System.Object에 방법의 유형을 변경하거나 더 나은 솔루션으로 클래스를 만듭니다에 값을 전송해야 하나, 그래서 또한 메소드의 반환 유형은 IQueryable입니다 클래스의 속성을 가져 와서 반환하십시오.

+1

ToList 대신 (이유없이 새로운 List를 생성합니다) AsEnumerable을 사용할 수 있습니다. –

+0

ToList 대신 AsQueryable()을 사용해야하지만 여전히 불행하게도 오류가 발생합니다. –

+0

내 메서드의 결과가 IQueryable –