我的扩展方法是:
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.
由于
答案 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很难在子查询中使用扩展方法。使用重写表达式扩展方法,每个工作正常。
还有其他解决方案吗?