3 Stimmen

LINQ-to-SQL und Erweiterungsmethode in subQuery

Meine Erweiterungsmethode ist:

public static IEnumerable<T> FilterCultureSubQuery<T>(this Table<T> t)
    where T : class
    {
      return t;
    }

Ich habe versucht, sie in dieser Abfrage zu verwenden

var test = from p in t.Products
             select new
             {
               Allo = p,
               Allo2 = (from pl in t.ProductLocales.FilterCultureSubQuery()
                        select pl)
             };

Wie soll die Signatur meiner Methodenerweiterung lauten? Ich bekomme immer diesen Fehler:

Method 'System.Collections.Generic.IEnumerable\`1\[ProductLocale\] FilterCultureSubQuery\[ProductLocale\](System.Data.Linq.Table\`1\[ProductLocale\])' has no supported translation to SQL.

Ich habe auch diese Signatur ausprobiert:

public static IQueryable<T> FilterCultureSubQuery<T>(this Table<T> t)
    where T : class
    {
      return t;
    }

Und ich bekam diese Fehlermeldung:

Method 'System.Linq.IQueryable\`1\[ProductLocale\] FilterCultureSubQuery\[ProductLocale\](System.Data.Linq.Table\`1\[ProductLocale\])' has no supported translation to SQL.

Danke

4voto

James Curran Punkte 98228

Die Signatur Ihrer Methode ist in Ordnung. Das Problem ist, wie gesagt, dass es "keine unterstützte Übersetzung in SQL" gibt.

DLINQ versucht, diese Anweisung in eine SQL-Zeile umzuwandeln, die es an die Datenbank sendet. Diese Methode hat keine Übersetzung.

Ich würde vorschlagen, den Filter mit einer Where-Klausel neu zu schreiben.

2voto

driis Punkte 156110

An Ihrer Methode der Erweiterung ist nichts auszusetzen.

Sie erhalten diese Ausnahme, weil Sie versuchen, Ihre benutzerdefinierte Methode in einer LINQ-To-SQL-Abfrage zu verwenden, und LINQ-To-SQL keine Übersetzung in SQL für Ihre Methode kennt. Es kann also keine SQL-Abfrage aus Ihrem LINQ-Ausdruck konstruieren.

Die Lösung wäre, zuerst die Daten zu erhalten und dann die Transformation anzuwenden.

1voto

Cédric Boivin Punkte 10320

Wenn ich meine Erweiterungsmethode in einer einfachen Abfrage verwende, funktioniert sie, aber wenn ich sie in einer Unterabfrage verwende, funktioniert sie nicht. Irgendwelche Lösungen?

Arbeiten

var test = from pl in t.ProductLocales.FilterCultureSubQuery()  select pl;

Arbeitet nicht

var test = from p in t.Products
           select new
           {
             Allo = p,
             Allo2 = (from pl in t.ProductLocales.FilterCultureSubQuery()
                      select pl)
           }; 

Ich erstelle eine neue Erweiterungsmethode und schreibe den Ausdrucksbaum der Abfrage um.

var test = (from p in t.Products
               select new
               {
                 Allo = p,
                 Allo2 = (from pl in t.ProductLocales.FilterCultureSubQuery()
                          select pl)
               }).ArrangeExpression(); 

LINQ-TO-SQL haben Schwierigkeiten bei der Verwendung von Erweiterungsmethoden in Subqueries. Mit einem Rewrite-Ausdruck Erweiterung Methode everyting arbeiten gut.

Gibt es andere Lösungen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X