2009-04-15 5 views
3

Ma méthode d'extension est:LINQ to SQL et la méthode d'extension dans la sous-requête

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

J'ai essayé de l'utiliser dans cette requête

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

Ce qui est censé être la signature de ma méthode extension? Je reçois toujours cette erreur:

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

J'ai aussi essayé cette signature:

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

Et je suis arrivé cette erreur:

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

Merci

Répondre

1

Lorsque j'utilise ma méthode d'extension dans une requête simple, cela fonctionne, mais lorsque je l'utilise dans une sous-requête, cela ne fonctionne pas. Des solutions?

Travailler

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

ne fonctionne pas

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

Je crée une nouvelle méthode d'extension et de réécrire l'arbre d'expression de la requête.

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

LINQ-TO-SQL ont des difficultés à utiliser la méthode d'extension dans la sous-requête. Avec une méthode d'extension d'expression de réécriture, tout fonctionne correctement.

D'autres solutions?

4

La signature de votre méthode est bien. Le problème est, comme indiqué, il "n'a aucune traduction prise en charge à SQL".

DLINQ tente de convertir cette instruction en une ligne de SQL qu'il enverra à la base de données. Cette méthode n'a pas de traduction.

Je suggérerais de réécrire le filtre en utilisant une clause Where.

2

Il n'y a aucun problème avec votre méthode d'extension.

Vous obtenez cette exception car vous essayez d'utiliser votre méthode personnalisée dans une requête LINQ-To-SQL et LINQ-To-SQL ne connaît pas de traduction vers SQL pour votre méthode. Il ne peut donc pas construire une requête SQL à partir de votre expression LINQ.

La solution serait d'obtenir les données en premier, puis d'appliquer votre transformation.