2016-06-14 32 views
3

ich Laufzeitfehler bin immerEnumerable.Empty <T>() .AsQueryable(); Diese Methode unterstützt die LINQ to Infrastruktureinheiten und ist nicht direkt aus dem Code verwendet werden soll

Diese Methode, die LINQ to Entities-Infrastruktur unterstützt und ist nicht soll direkt verwendet werden, von dein Code.

Beschreibung: Bei der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stack-Trace für weitere Informationen über den Fehler und wo es im Code entstanden ist.

Ausnahmedetails: System.InvalidOperationException: Diese Methode unterstützt die LINQ to Entities-Infrastruktur und soll nicht direkt aus Ihrem Code verwendet werden.

Ich versuche Abfrage zu erzeugen, anstatt alle Suchkriterien zu filtern, indem alle gefundenen Datensätze auf allen Suchfeldern umfassen würde (täte OR statt AND).

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

Mechanismus versagt begann, als ich var results = Enumerable.Empty<T>().AsQueryable(); eingeführt, die ich brauche, leer von etwas zu beginnen.

Wie beginne ich von einem leeren Satz und dann Linq-to-Sql-Ergebnisse auf der Oberseite?

+0

Eine Vermutung: 'queryable.Take (0)' könnte den Trick tun. Es könnte eine gute Idee sein, *** genau anzugeben, wo diese Ausnahme auftritt. – spender

+0

@spender direkt vor '.ToList()' –

+0

Welche '.ToList'? – spender

Antwort

9

Sie den Code Refactoring kann nicht durch immer nur unioning Ergebnisse eine leere Menge müssen, die Sie:

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

Hallo Servy. Als ich sah, dass die Liste eingeführt wurde, dachte ich: "Was denkt er? Eine Liste!" Aber dann habe ich gemerkt, was du getan hast, ich muss sagen - das ist großartig ... :) Danke. –

+0

@IvanStoev können Sie ein 'DefaultIfEmpty' hinzufügen, um das Verhalten zu definieren. Es hängt davon ab, was die Spezifikationen sein sollen, wenn es sogar ein unterstützter Fall ist. Mein anfänglicher Verdacht ist, dass "queryable" als Standardwert verwendet werden soll. – Servy

+0

@IvanStoev in meinem Fall gab ich 'return subQueries.Any() zurück? subQueries.Aggregate ((a, b) => a.Union (b)): abfragbar; ' –

1

Temporäre Hack, ich

von

var results = Enumerable.Empty<T>().AsQueryable(); 
ändern verwendet haben

zu

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