2016-06-14 5 views
3

내가Enumerable.Empty <T>() .AsQueryable(); 이 방법은 엔티티 인프라에 LINQ를 지원하고

이 방법은 엔티티 인프라에 LINQ를 지원하며에서 직접 사용할 수 없는 런타임 오류가 발생하고 사용자 코드에서 직접 사용할 수 없습니다 당신의 코드.

설명 현재 웹 요청 을 실행하는 중 처리되지 않은 예외가 발생했습니다. 오류에 대한 정보와 코드에서 오류가 발생한 위치에 대한 정보는 에 대한 스택 추적을 검토하십시오.

예외 정보 : System.InvalidOperationException :이 메서드 은 LINQ to Entities 인프라를 지원하며 코드에서 직접 사용 된 은 아닙니다. 나는 모든 검색 기준을 필터링하는 것은 모든 검색 필드에 일치하는 모든 레코드를 추가로 포함하는 것보다는 쿼리를 생산하기 위해 노력하고

(OR보다는 AND 할 것). 나는 빈에서 뭔가 시작해야 var results = Enumerable.Empty<T>().AsQueryable();을 도입 할 때

public static IQueryable<T> ApplySearch<T>(this IQueryable<T> queryable, SearchModel search) where T : class 
{ 
    var results = Enumerable.Empty<T>().AsQueryable(); 
    if (search != null) 
    { 
     if (search.PolicyNumber.HasValue && typeof (IPolicyNumber).IsAssignableFrom(queryable.ElementType)) 
     { 
      results = results.Union(queryable.SearchByPolicyNumber(search)); 
     } 

     if (search.UniqueId.HasValue && typeof (IUniqueId).IsAssignableFrom(queryable.ElementType)) 
     { 
      results = results.Union(queryable.SearchByUniqueId(search)); 
     } 

     if (!string.IsNullOrWhiteSpace(search.PostCode) && typeof(IPostCode).IsAssignableFrom(queryable.ElementType)) 
     { 
      results = results.Union(queryable.SearchByPostCode(search)); 
     } 
    } 

    return results; 
} 

메커니즘은 실패하기 시작했다.

빈 세트에서 시작하여 맨 위에 Linq-to-SQL 결과를 어떻게 작성합니까?

당신은 오직 당신이 결과를 unioning에 의해 빈 세트를 필요로하지 않도록 코드를 리팩토링 할 수
+0

추측 :'queryable.Take (0)'이 트릭을 할 수 있습니다. 이 예외가 발생하는 곳에서 정확히 ***을 지적하는 것이 좋습니다. – spender

+0

'.ToList()'바로 앞에 @spender가 있습니다. –

+0

어느'.ToList'입니까? – spender

답변

9

:

내가

을 사용했다

임시 해킹

var results = Enumerable.Empty<T>().AsQueryable(); 
에서 변경하는 것입니다
public static IQueryable<T> ApplySearch<T>(this IQueryable<T> queryable, SearchModel search) where T : class 
{ 
    var subQueries = new List<IQueryable<T>>(); 
    if (search != null) 
    { 
     if (search.PolicyNumber.HasValue && typeof (IPolicyNumber).IsAssignableFrom(queryable.ElementType)) 
     { 
      subQueries.Add(queryable.SearchByPolicyNumber(search)); 
     } 

     if (search.UniqueId.HasValue && typeof (IUniqueId).IsAssignableFrom(queryable.ElementType)) 
     { 
      subQueries.Add(queryable.SearchByUniqueId(search)); 
     } 

     if (!string.IsNullOrWhiteSpace(search.PostCode) && typeof(IPostCode).IsAssignableFrom(queryable.ElementType)) 
     { 
      subQueries.Add(queryable.SearchByPostCode(search)); 
     } 
    } 

    return subQueries.DefaultIfEmpty(queryable) 
     .Aggregate((a, b) => a.Union(b)); 
} 
+0

안녕하세요. 내가 List가 소개되는 것을 보았을 때 - 나는 "그가 생각하는 것이 무엇인가!리스트!"와 같았다. 하지만 그때 나는 네가 한 일을 깨달았다. 나는 이렇게 말해야한다. - 이것은 훌륭하다. .. :) 고마워. –

+0

@IvanStoev 당신은 행동을 정의하기 위해'DefaultIfEmpty'를 추가 할 수 있습니다. 지원되는 경우라도 스펙이 무엇을 원하는지에 달려 있습니다. 나의 초기 의심은'queryable'을 디폴트 값으로 사용하고 싶다는 것이다. – Servy

+0

@IvanStoev 제 경우에'return subQueries.Any()? subQueries.Aggregate ((a, b) => a.Union (b)) : 쿼리 가능; –

1

var results = queryable.Where(o => false); 
에 0