我正在开发Web自定义控件,它能够将过滤器应用于LinqDataSource对象。它是通用控件,因为它应该与某种类型的对象一起操作。
控件通过跟随字段知道它应该操作的对象字段
/// <summary>
/// Method to get compared column from object
/// </summary>
public Expression<Func<T, int>> GetColumnMethod;
(转移到从对象类型得到适当的领域的方法)
我们使用这样的代码执行过滤
... if(selectedValue ==“<=”)predicate = predicate.And(c => method(c)<= val); if(selectedValue ==“<”)predicate = predicate.And(c => method(c)<val);
一切正常,直到发生LINQ to SQL转换。然后错误“方法'.....'没有支持的SQL转换。
当然,CLR不知道如何为委托制作SQL。
如果只有C#可以在转换为SQL之前编译表达式,但我不知道如何让它去做。
像Expression.Compile这样的变态(无论我整天尝试过什么棘手的方式 - 我已经记不起来了......没有任何帮助)
但是......在运行时CLR已经知道我的对象的类型,因此它可以设法构建具有compiked委托值的SQL表达式。但怎么办呢?
发布于 2019-03-20 09:12:40
LINQ to SQL提供程序负责将表达式树转换为有效的T-SQL语句。由于C#和T-SQL之间没有一对一的关系,因此表达树越复杂,LINQ to SQL转换的可能性就越小。
当您使用lambda表达式时,您必须决定是要编译它还是将其用作表达式树。如果要将lambda用作表达式,那么您有责任确保表达式包含提供程序支持的函数和语法。
发布于 2019-03-20 10:03:21
任意委托都没有SQL。如果method(c)
可以表示为lambda,则可以使用lambont将lambda作为子表达式调用Expression.Invoke
,但是您需要自己构建表达式树
https://stackoverflow.com/questions/-100001009
复制相似问题