Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >扩展SqlMethods.Like以支持属性名称

扩展SqlMethods.Like以支持属性名称
EN

Stack Overflow用户
提问于 2010-07-28 11:32:25
回答 2查看 1K关注 0票数 0

我正在尝试扩展SqlMethods.Like方法以支持属性名称而不是属性值,我写了以下扩展方法:

代码语言:javascript
运行
AI代码解释
复制
        public static bool Like(this object obj, string propertyName, string pattern)
    {
        var properties = obj.GetType().GetProperties().Select(p => p.Name);

        if(!properties.Contains(propertyName))
            throw new Exception(string.Format("Object does not contain property:{0}", propertyName));

        return SqlMethods.Like(obj.GetType().GetProperty(propertyName).GetValue(obj, null).ToString(), pattern);
    }

但是,该方法引发以下异常:方法“Boolean Like(System.Object,System.String,System.String)”不支持到SQL的转换。

如何编写支持SQL事务的扩展方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-29 14:44:46

我从RichardD那里找到了这个答案,这正是正确的答案。为清楚起见,转载,但原文链接如下。

代码语言:javascript
运行
AI代码解释
复制
using System;  
using System.Linq;  
using System.Linq.Expressions;  

public static class Extensions  
{  
    public static IQueryable<T> WhereLike<T>(this IQueryable<T> source, string propertyName, string pattern)  
    {  
        if (null == source) throw new ArgumentNullException("source");  
        if (string.IsNullOrEmpty(propertyName)) throw new ArgumentNullException("propertyName");  

        var a = Expression.Parameter(typeof(T), "a");  
        var prop = Expression.Property(a, propertyName);  
        var body = Expression.Call(typeof(SqlMethods), "Like", null, prop, Expression.Constant(pattern));  
        var fn = Expression.Lambda<Func<T, bool>>(body, a);  

        return source.Where(fn);  
    }  
}  
...  
.WhereLike("Description", "%a%b%c%"));  

该解决方案使用表达式树,但所有高级LinqToSql操作都需要熟悉表达式树。

来自:http://forums.asp.net/p/1488418/3503874.aspx

票数 1
EN

Stack Overflow用户

发布于 2010-07-28 11:52:15

与SqlMethods.Like实际做的事情相比,你想做的事情似乎没有什么意义。当您传入一个类的属性时,您实际上是在告诉它将其转换为SQL查询中的等价字段。例如:

代码语言:javascript
运行
AI代码解释
复制
var result = from names in db.Names
             where SqlMethods.Like(names.FullName, '%Smith%')
             select names;

会转化成类似这样的东西:

代码语言:javascript
运行
AI代码解释
复制
SELECT * 
FROM Names
WHERE Fullname LIKE '%Smith%'

(在实践中,使用参数和sp_executeSQL会有所不同,但实际上它就是这样做的)。

如果你想传入一个属性的名称,这在SQL中意味着什么,从概念上讲没有任何意义,例如

代码语言:javascript
运行
AI代码解释
复制
SELECT * 
FROM Names
WHERE --what would go here-- LIKE '%Smith%'

因此,您将无法创建创建无意义SQL的Linq to SQL方法。

你真正想做的是什么,很有可能你的做法完全错了。

编辑:从你的评论中我想我知道你想要做什么,在本质上你希望能够指定你在运行时与之进行相似比较的列。你不能完全做到这一点。您可以使用使用动态SQL并接受列的字符串参数的存储过程。然后,您可以将其作为数据上下文类上的方法公开。

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

https://stackoverflow.com/questions/3352381

复制
相关文章
Geoserver扩展以支持Erdas Image数据的服务发布
Geoserver默认支持的栅格数据源比较少,包括ArcGrid,GeoTiff,WorldImage,ImageMosaic等,是不支持Erdas Img格式的栅格数据源的,因此,为了能够让Geoserver支持发布Erdas Img格式的数据源,需要用GDAL的插件对Geoserver进行扩展,本文讲述如何在Geoserver中配置并支持Erdas Img格式的数据源。
牛老师讲GIS
2018/10/23
2.6K0
Geoserver扩展以支持Erdas Image数据的服务发布
【Kotlin】扩展属性 ( 扩展变量属性 | 扩展常量属性 | 注意事项 | 本质分析 )
① 修饰 : 变量扩展属性使用 var 修饰 , 常量扩展属性使用 val 修饰 ;
韩曙亮
2023/03/27
9750
【Kotlin】扩展属性 ( 扩展变量属性 | 扩展常量属性 | 注意事项 | 本质分析 )
【Android Gradle 插件】Gradle 扩展属性 ③ ( 为任意对象设置扩展属性 | 扩展属性定义方式 )
中 , 直接在 build.gradle 构建脚本 中定义的 扩展属性 , 是为 org.gradle.api.Project 对象定义的扩展属性 ;
韩曙亮
2023/03/30
8580
【Android Gradle 插件】Gradle 扩展属性 ③ ( 为任意对象设置扩展属性 | 扩展属性定义方式 )
【Android Gradle 插件】Gradle 扩展属性 ④ ( 扩展属性访问方式 | 直接访问扩展属性 | 通过 ext 对象访问 | 在 gradle.properties 中定义扩展属性 )
也可以 通过 project.ext.hello 访问该扩展属性 , 代码如下 :
韩曙亮
2023/03/30
2.7K0
【Android Gradle 插件】Gradle 扩展属性 ④ ( 扩展属性访问方式 | 直接访问扩展属性 | 通过 ext 对象访问 | 在 gradle.properties 中定义扩展属性 )
【Android Gradle 插件】Gradle 扩展属性 ② ( 定义在根目录 build.gradle 中的扩展属性 | 使用 rootProject.扩展属性名访问 | 扩展属性示例 )
org.gradle.api.Project 配置 ( build.gradle 根配置 ) 文档 : https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html
韩曙亮
2023/03/30
3.1K0
【Android Gradle 插件】Gradle 扩展属性 ② ( 定义在根目录 build.gradle 中的扩展属性 | 使用 rootProject.扩展属性名访问 | 扩展属性示例 )
扩展htmlhelper.DropDownListFor 支持list数据源和option增加属性
mvc自带的DropDownListFor数据源必须是IEnumerable<SelectListItem>。并且option不支持增加自定义属性。在使用bootstrap-select组件的时候,发现不是很好用。所以扩展了一下。
旺财的城堡
2018/11/20
8220
Spring使用p名称空间配置属性
Spring的p标签是基于XML Schema的配置方式,目的是为了简化配置方式。
大黄大黄大黄
2018/09/14
9660
Spring使用p名称空间配置属性
Power BI 支持的颜色名称列表
在Power BI可用直接使用英文颜色名称自定义颜色,比如字体颜色、背景色、填充色等,通常使用条件判断进行颜色变化。
wujunmin
2022/12/13
1.3K0
Power BI 支持的颜色名称列表
获取对象属性类型、属性名称、属性值的研究:反射和JEXL解析引擎
先简单介绍下反射的概念:java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以在运行时装配。在实际的业务中,可能会动态根据属性去获取值。 工具类如下: package com.yaoguang.common.utils.field; import java.beans.Bean
猿人谷
2018/01/17
6.8K0
spring开发_使用p名称空间配置属性
http://www.cnblogs.com/hongten/gallery/image/112563.html
Hongten
2018/09/13
4940
第6章 扩展函数与属性第6章 扩展函数与属性
在使用Java的时候,我们经常使用诸如StringUtil, DateUtil等等一堆工具类,代码写起来也比较冗长。举个例子,获取一个字符串的第一个字符值、最后一个字符值。如果我们用Java代码来写,通常是要先声明一个StringUtil类,然后在里面写相应的工具方法,代码可以是下面的这个样子
一个会写诗的程序员
2018/08/17
4830
第6章 扩展函数与属性第6章 扩展函数与属性
53. Vue名称案例-使用computed计算属性
前面在写名称拼接案例的时候使用了keyup监听文本框,还使用了watch来监听数据变化,那么本篇章来使用computed计算属性来监听实现。
Devops海洋的渔夫
2022/01/17
5970
53. Vue名称案例-使用computed计算属性
属性元素,标记扩展和注释
一般的,我们想要对一个标签的属性赋值,可以直接在标签内部键入属性名给其赋值,如我们给button的Content属性赋值:
宿春磊Charles
2021/11/05
6870
Enum扩展特性,代替中文属性
把原文中的out参数替换成返回元组,由于项目是vs2015开发,不能用c#7.0特性,否则用7.0中的值元组应该更好一点。性能和显示友好性都会有改进。
用户6362579
2019/09/29
4270
Kotlin入门(33)运用扩展属性
进行App开发的时候,使用震动器要在AndroidManifest.xml中加上如下权限:
aqi00
2019/01/18
9350
Linq Like的操作
Like的操作,有点像in,但是,方向变了。什么意思呢。就是你给定一个字符串,去寻找数据中某个字段包含这个字符串。就是给定的字符串是某字段的子集。Sql Script是这么写的。 Selec * from table where id like '%AD%'Selec * from table where id like '%AD'Selec * from table where id like 'AD%'上面的%是通配符,表示,该字段含有某个值,不知道的位置使用%代替。第一个是表示中间一段是AD,两头
逸鹏
2018/04/10
8530
【Android Gradle 插件】Gradle 扩展属性 ① ( Gradle 扩展属性简介 | Gradle 自定义 task 任务示例 )
org.gradle.api.Project 配置 ( build.gradle 根配置 ) 文档 : https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html
韩曙亮
2023/03/30
7760
【Android Gradle 插件】Gradle 扩展属性 ① ( Gradle 扩展属性简介 | Gradle 自定义 task 任务示例 )
Chrome迅雷下载支持扩展1.1
喜欢chrome浏览器又经常使用迅雷下载东西的朋友注意了,chrome迅雷下载扩展已经发布了。再也不用复制到IE打开或者使用IE tab了。
reizhi
2022/09/26
9770
Chrome迅雷下载支持扩展1.1
点击加载更多

相似问题

如何扩展json模式元模式以支持新属性?

120

如何扩展React类型以支持html属性作为道具?

21

扩展设计以支持JSON

21

扩展ArrayList以支持事件

22

扩展Libeasy以支持chromecast

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档