子查询中的LINQ-to-SQL和Extension方法

时间:2009-04-15 20:00:51

标签: c# linq linq-to-sql extension-methods

我的扩展方法是:

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

我尝试在此查询中使用它

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

我的方法扩展的签名应该是什么?我总是得到这个错误:

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

我也试过这个签名:

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

我收到了这个错误:

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

由于

3 个答案:

答案 0 :(得分:4)

你方法的签名很好。问题是,如上所述,它“没有支持的SQL转换”。

DLINQ正在尝试将该语句转换为将发送到数据库的SQL行。该方法没有翻译。

我建议使用Where子句重写过滤器。

答案 1 :(得分:2)

您的扩展方法没有任何问题。

您得到该异常是因为您尝试在LINQ-To-SQL查询中使用自定义方法,而LINQ-To-SQL不知道为您的方法转换为SQL。因此,它无法从LINQ表达式构造SQL查询。

解决方案是首先获取数据,然后应用转换。

答案 2 :(得分:1)

当我在一个简单的查询中使用我的扩展方法时,它正在工作,但是当我在子查询中使用它时它不起作用。任何解决方案?

工作

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

不工作

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

我创建了一个新的扩展方法并重写了查询的表达式树。

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

LINQ-TO-SQL很难在子查询中使用扩展方法。使用重写表达式扩展方法,每个工作正常。

还有其他解决方案吗?