繁体   English   中英

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

[英]extending SqlMethods.Like to support property name

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

        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的扩展方法?

我从RichardD找到了这个答案,这是正确的答案。 为了清楚起见,重新发布,但原始链接在下面。

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

在SqlMethods.Like实际执行的操作中,要执行的操作似乎没有意义。 当您传递类的属性时,实际上是在告诉它将其转换为SQL查询中的等价字段。 例如

var result = from names in db.Names
             where SqlMethods.Like(names.FullName, '%Smith%')
             select names;

会翻译成这样:

SELECT * 
FROM Names
WHERE Fullname LIKE '%Smith%'

(在实践中,使用参数和sp_executeSQL会有所不同,但是从概念上讲,这将是这样做的)。

如果您想传递属性的名称,那么对于SQL而言,这意味着什么,从概念上讲,这是没有意义的,例如

SELECT * 
FROM Names
WHERE --what would go here-- LIKE '%Smith%'

因此,您将无法创建创建废话SQL的Linq To SQL方法。

您实际上要做什么,可能是您完全以错误的方式进行操作。

编辑:从您的评论嗯,我想我知道您想做什么,从本质上来说,您希望能够指定要在运行时与LIKE比较的列。 您无法完全做到。 您可以使用一个存储过程,该存储过程使用动态SQL并为该列使用字符串参数。 然后,您可以将此方法公开为数据上下文类的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM