Ключевое слово SQL Like в Dynamic Linq - PullRequest
3 голосов
/ 27 апреля 2010

Я хочу использовать ключевое слово Like SQL в динамическом LINQ.

Запрос, который я хочу сделать, выглядит следующим образом

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\"");

что мы можем динамически изменять столбец и ключ поиска

Ответы [ 5 ]

3 голосов
/ 09 февраля 2011

Это должно работать для вас:

.Where("AColumnName.Contains(@0)", "Criteria") 
2 голосов
/ 31 октября 2012

Создать класс 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%");
0 голосов
/ 26 июля 2017

Возможно, немного поздно, но другой подход - добавить метод Extention, который использует 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, метод вернет исходную сущность, которую вы передали ему ранее.

0 голосов
/ 28 апреля 2010

Я не верю, что существует прямой перевод на SQL для ключевого слова LIKE в LINQ. Вы могли бы построить его, если бы использовали деревья выражений, но я еще не получил этого.

То, что я делаю, выглядит примерно так:

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.

0 голосов
/ 27 апреля 2010

http://weblogs.asp.net/rajbk/archive/2007/09/18/dynamic-string-based-queries-in-linq.aspx

Дополнительно:

Использовать дерево выражений Как создать дерево выражений для представления 'String.Contains ("term") "в C #? Это то, что динамическая библиотека linq делает внутри.

...