Linq To SQL问题 - 没有支持的SQL转换(C#属性的问题)

Rob*_*eal 14 c# extension-methods linq-to-sql

我正在将一些Linq扩展到SQL类.我有两个类似的语句,第一个工作,第二个没有("没有支持转换为SQL"错误).

var reg2 = rs.ProductRegistrations().SingleOrDefault(p => p.Product.product_name == "ACE")

var reg5 = rs.ProductRegistrations().SingleOrDefault(p => p.product_name == "ACE");
Run Code Online (Sandbox Code Playgroud)

阅读此链接后LINQ:没有翻译到SQL

我理解(我认为),基本上所有东西都需要"内联",否则无法正确计算表达式树.第一个示例直接访问LinqToSql EntitySet"Product"(保持所有内联),而第二个示例使用如下定义的属性:

public partial class ProductRegistration :IProduct
{
    public string product_name
    {
        get { return this.Product.product_name; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我假设我的问题是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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

很想能够做到这一点......

public partial class ProductRegistration :IProduct
{
    [Auto-Expression]
    public string product_name
    {
        get { return this.Product.product_name; }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑 以下链接和答案有效.太好了,谢谢.我的问题的第二部分,我有两个类似的语句,第一个工作,第二个不工作("没有支持转换为SQL"错误).

var reg = rs.ProductRegistrations().ProductName("ACE").WithTranslations().SingleOrDefault();

var reg2 = rs.ProductRegistrations2().ProductName("ACE").WithTranslations().SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

它们的区别在于第一个返回具体类 "IQueryable [ProductRegistration]"的IQueryable,而第二个返回接口 "IQueryable [IProduct]"的IQueryable.我想使用第二个,因为我可以在许多不同的类中打开接口,并且它更通用,但它似乎不起作用.有任何想法吗?

Cra*_*ntz 10

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

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

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

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