【问题标题】:SQL Like keyword in Dynamic LinqDynamic Linq 中的 SQL Like 关键字
【发布时间】:2010-04-27 02:39:16
【问题描述】:

我想在动态 LINQ 中使用 SQL 的 Like 关键字。

我想做的查询是这样的

select * from table_a where column_a like '%search%'

其中 column_a 可以动态更改为其他列等

在这个动态 LINQ 中

var result = db.table_a.Where( a=> (a.column_a.Contains("search")) );

但不能动态改变列,只有搜索键可以

我们如何创建像这样的动态 LINQ

var result = db.table_a.Where("column_a == \"search\"");

我们可以动态改变列和搜索键

【问题讨论】:

标签: dynamic linq-to-sql sql-like


【解决方案1】:

这应该适合你:

.Where("AColumnName.Contains(@0)", "Criteria") 

【讨论】:

    【解决方案2】:

    用这个函数创建一个 ExtensionMethods 类

        public static IQueryable<T> Like<T>(this IQueryable<T> source, string propertyName, string keyword)
        {
            var type = typeof(T);
            var property = type.GetProperty(propertyName);
            string number = "Int";
            if (property.PropertyType.Name.StartsWith(number))
                return source;
    
            var parameter = Expression.Parameter(type, "p");
            var propertyAccess = Expression.MakeMemberAccess(parameter, property);
            var constant = Expression.Constant("%" + keyword + "%");
            MethodCallExpression methodExp = Expression.Call(null, typeof(SqlMethods).GetMethod("Like", new Type[] { typeof(string), typeof(string) }), propertyAccess, constant);
            Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(methodExp, parameter);
            return source.Where(lambda);
        }
    

    然后这样称呼它:

    var result = db.table_a.Like("column_a", "%search%");
    

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 我在上面的链接中找不到 SQL 的“like”示例。但是有一个使用“==”的“相等”样本。但这不是我要找的
      【解决方案4】:

      我不相信 LINQ 中的 LIKE 关键字可以直接转换为 SQL。如果您使用表达式树,您可以构建一个,但我还没有那么好。

      我做的是这样的:

      using System.Data.Linq.SqlClient;
      
      if (!string.IsNullOrEmpty(data.MailerName))
          search = search.Where(a => SqlMethods.Like(a.Mailer.Name, string.Format("%{0}%", data.MailerName)));
      

      其中search 是我正在构建的查询,data 是包含保存搜索条件的属性的对象。我通过以这种方式列出所有可能的搜索条件来动态构建查询,这会将适当的Where 方法添加到search

      【讨论】:

        【解决方案5】:

        可能有点晚了,但另一种方法是添加使用Contains 模拟Like 关键字的扩展方法:

        public static class DbHelpers
            {
                public static IQueryable<T> Like<T>(this IQueryable<T> source, string propertyName, string propertyValue)
                {
                    var prop = typeof(T).GetProperty(propertyName);
                    if (prop == null || prop.PropertyType.Name.StartsWith("Int"))
                        return source;
        
                    ParameterExpression parameter = Expression.Parameter(typeof(T), "row");
                    Expression property = Expression.Property(parameter, propertyName);
                    Expression value = Expression.Constant(propertyValue);
        
                    var containsmethod = value.Type.GetMethod("Contains", new[] { typeof(string) });
                    var call = Expression.Call(property, containsmethod, value);
                    var lambda = Expression.Lambda<Func<T, bool>>(call, parameter);
                    return source.Where(lambda);
                }
            }
        

        以及它的用途:

        var foo = entity.AsQueryable().Like("Name", "bla bla");
        

        如果发送PropertyName 类型为int,则该方法返回您之前传递给它的原始实体。

        【讨论】:

          猜你喜欢
          • 2012-04-25
          • 1970-01-01
          • 2013-06-09
          • 2019-08-29
          • 1970-01-01
          • 2011-11-06
          • 1970-01-01
          • 2013-03-16
          • 1970-01-01
          相关资源
          最近更新 更多