Linq To SQL问题 – 不支持对SQL的翻译(C#属性的问题)
我将一些
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“产品”(保持一切内联),而第二个示例使用一个定义如下的属性: 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; } } } 编辑 var reg = rs.ProductRegistrations().ProductName("ACE").WithTranslations().SingleOrDefault(); var reg2 = rs.ProductRegistrations2().ProductName("ACE").WithTranslations().SingleOrDefault(); 它们之间的区别在于第一个返回一个具体类“IQueryable [ProductRegistration]”的IQueryable,而第二个返回IQueryable的接口“IQueryable [IProduct]”.我想使用第二个,因为我可以拍摄许多不同的类的界面,它是更通用的方式,但它似乎不起作用.有任何想法吗? 解决方法
有,非常近.你还是要做一些工作,但是Damien Guard和朋友为你做了很大的努力:Client-side properties and any remote LINQ provider 很酷的是,它可以与任何支持您使用的表达式的LINQ提供程序配合使用. 更新:您的第二个版本(使用界面)的问题是,可查询提供程序需要能够弄清楚接口的实现者是什么,因为它需要将其转换为表名称.但是,接口的全部要点是接口用户对于实现类型应该是不可知的,因此提供者将在与接口的交叉目的上工作.所以我不认为第二种形式会奏效. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |