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“产品”(保持一切内联),而第二个示例使用一个定义如下的属性:
public partial class ProductRegistration :IProduct { public string product_name { get { return this.Product.product_name; } } }
我假设我的问题是LinqTosql无法翻译.
我将如何将“财产”变成等效的声明?我知道我需要使用System.Linq.Expressions.Expression,但我所尝试的一切都不起作用(有些甚至不编译).也许我应该做一个扩展方法(使用表达式),然后从属性中调用?一个属性可以调用扩展方法吗?
以下事情不起作用:
public static System.Linq.Expressions.Expression<Func<IProduct,bool>> ProductName2 (string pname) { return (p => p.product_name == pname); }
底线,我知道我需要将我的访问方法包含在“表达式< ....>”中但是我不知道如何从属性中访问它,以便上面的“reg5”变量可以正常工作.
如果有一些魔法属性,我可以添加到属性“auto-expression”属性并使LinqTosql快乐,而不是将其包装在Expression< ...>
很想能够做到这一点
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]”.我想使用第二个,因为我可以拍摄许多不同的类的界面,它是更通用的方式,但它似乎不起作用.有任何想法吗?
解决方法
Would be great if there was some magic attribute that I could just add to the property to “auto-expression” the property and make LinqTosql happy,instead of wrapping it in Expression<…>
有,非常近.你还是要做一些工作,但是Damien Guard和朋友为你做了很大的努力:Client-side properties and any remote LINQ provider
很酷的是,它可以与任何支持您使用的表达式的LINQ提供程序配合使用.
更新:您的第二个版本(使用界面)的问题是,可查询提供程序需要能够弄清楚接口的实现者是什么,因为它需要将其转换为表名称.但是,接口的全部要点是接口用户对于实现类型应该是不可知的,因此提供者将在与接口的交叉目的上工作.所以我不认为第二种形式会奏效.