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提供程序需要能够弄清楚接口的实现者是什么,因为它需要将其转换为表名.但是接口的全部意义在于接口用户应该对实现类型不了解,因此提供者将与接口交叉工作.所以我认为第二种形式不会起作用.
归档时间: |
|
查看次数: |
6735 次 |
最近记录: |