首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在编译时不知道对象类型时如何构建LINQ查询

如何在编译时不知道对象类型时如何构建LINQ查询
EN

Stack Overflow用户
提问于 2019-03-20 00:16:25
回答 2查看 0关注 0票数 0

我正在开发Web自定义控件,它能够将过滤器应用于LinqDataSource对象。它是通用控件,因为它应该与某种类型的对象一起操作。

控件通过跟随字段知道它应该操作的对象字段

代码语言:javascript
复制
    /// <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表达式。但怎么办呢?

EN

回答 2

Stack Overflow用户

发布于 2019-03-20 09:12:40

LINQ to SQL提供程序负责将表达式树转换为有效的T-SQL语句。由于C#和T-SQL之间没有一对一的关系,因此表达树越复杂,LINQ to SQL转换的可能性就越小。

当您使用lambda表达式时,您必须决定是要编译它还是将其用作表达式树。如果要将lambda用作表达式,那么您有责任确保表达式包含提供程序支持的函数和语法。

票数 0
EN

Stack Overflow用户

发布于 2019-03-20 10:03:21

任意委托都没有SQL。如果method(c)可以表示为lambda,则可以使用lambont将lambda作为子表达式调用Expression.Invoke,但是您需要自己构建表达式树

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100001009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档