我正在将一些Linq扩展到SQL类。我有两个类似的语句,第一个有效,第二个没有(“没有支持的SQL转换”错误)。
var reg2 = rs.ProductRegistrations().SingleOrDefault(p => p.Product.product_name == "ACE")
var reg5 = rs.ProductRegistrations().SingleOrDefault(p => p.product_name == "ACE");
阅读此链接后LINQ: No Translation to SQL
我理解(我认为),基本上所有内容都需要“内联”,否则表达式树无法正确计算。第一个示例直接访问LinqToSql EntitySet“Product”(保持所有内联),而第二个示例使用如下定义的属性:
public partial class ProductRegistration :IProduct
{
public string product_name
{
get { return this.Product.product_name; }
}
}
我假设我的问题是LinqToSql无法翻译。
我如何将“财产”变成等效声明?我知道我需要使用System.Linq.Expressions.Expression,但我尝试的一切都不起作用(有些甚至不编译)。也许我应该创建一个Extension方法(使用Expression),然后从属性中调用它?属性可以调用扩展方法吗?
以下内容不起作用:
public static System.Linq.Expressions.Expression<Func<IProduct, bool>> ProductName2 (string pname)
{
return (p => p.product_name == pname);
}
最重要的是,我知道我需要将我的访问方法包装在“Expression&lt; ....&gt;”中但我不知道如何从属性中访问它,以便上面的“reg5”变量可以正常工作。
如果有一些魔法属性可以添加到属性中以“自动表达”属性并使LinqToSql满意,而不是将其包装在Expression&lt; ...&gt;中,那将会很棒
很想能够做到这一点......
public partial class ProductRegistration :IProduct
{
[Auto-Expression]
public string product_name
{
get { return this.Product.product_name; }
}
}
修改 以下链接和答案有效。太好了,谢谢。我的问题的第二部分,我有两个类似的陈述,第一个有效,第二个没有(“没有支持的SQL转换”错误)。
var reg = rs.ProductRegistrations().ProductName("ACE").WithTranslations().SingleOrDefault();
var reg2 = rs.ProductRegistrations2().ProductName("ACE").WithTranslations().SingleOrDefault();
它们的区别在于第一个返回具体类“IQueryable [ProductRegistration]”的IQueryable,而第二个返回接口的IQueryable “IQueryable的[IProduct]”。我想使用第二个,因为我可以在许多不同的类中打开接口,并且它更通用,但它似乎不起作用。有什么想法吗?
答案 0 :(得分:10)
如果有一些魔法属性可以添加到属性中以“自动表达”属性并使LinqToSql满意,而不是将其包装在Expression&lt; ...&gt;
中,那将会很棒
非常接近。你仍然需要做一些工作,但Damien Guard和朋友们为你做了很多努力:Client-side properties and any remote LINQ provider
很酷的是,它适用于任何支持你使用的表达式的LINQ提供程序。
更新:第二个版本(带接口)的问题是,Queryable提供程序需要能够弄清楚接口的实现者是什么,因为它需要音译进入表名。但是接口的重点在于接口用户应该对实现类型不了解,因此提供者将与接口交叉工作。所以我认为第二种形式不会起作用。