Linq To SQL问题 – 不支持对SQL的翻译(C#属性的问题)

前端之家收集整理的这篇文章主要介绍了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; }
    }
}

编辑
下面的链接和答案的作品.太好了,谢谢.我的问题的第二部分,我有两个类似的语句,第二个不(“没有支持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提供程序配合使用.

更新:您的第二个版本(使用界面)的问题是,可查询提供程序需要能够弄清楚接口的实现者是什么,因为它需要将其转换为表名称.但是,接口的全部要点是接口用户对于实现类型应该是不可知的,因此提供者将在与接口的交叉目的上工作.所以我不认为第二种形式会奏效.

猜你在找的MsSQL相关文章