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

时间:2010-01-18 20:03:11

标签: c# linq-to-sql extension-methods

我正在将一些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]”。我想使用第二个,因为我可以在许多不同的类中打开接口,并且它更通用,但它似乎不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:10)

  

如果有一些魔法属性可以添加到属性中以“自动表达”属性并使LinqToSql满意,而不是将其包装在Expression&lt; ...&gt;

中,那将会很棒

非常接近。你仍然需要做一些工作,但Damien Guard和朋友们为你做了很多努力:Client-side properties and any remote LINQ provider

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

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