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:没有转换为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> ProductName2 (string pname) { return (p => p.product_name == pname); } 

最重要的是,我知道我需要将我的访问方法包装在“Expression ”中,但我不知道如何从属性中访问它,以便上面的“reg5”变量可以正常工作。

如果有一些魔法属性可以添加到属性中以“自动表达”属性并使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 [IProduct]”的IQueryable。 我想使用第二个,因为我可以在许多不同的类中打开接口,并且它更通用,但它似乎不起作用。 有任何想法吗?

如果有一些魔法属性可以添加到属性中以“自动表达”属性并使LinqToSql满意,而不是将其包装在Expression <...>中,那将会很棒

有,非常接近。 你仍然需要做一些工作,但Damien Guard和朋友们为你做了很多困难: 客户端属性和任何远程LINQ提供者

很酷的是,它适用于任何支持你使用的表达式的LINQ提供程序。

更新:您的第二个版本(带有接口)的问题是,Queryable提供程序需要能够弄清楚接口的实现者是什么,因为它需要将其转换为表名。 但是接口的全部意义在于接口用户应该对实现类型不了解,因此提供者将与接口交叉工作。 所以我认为第二种forms不会起作用。