Есть ли способ в динамической библиотеке linq, чтобы выбрать ..., где начинается столбец с - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь выбрать поля, которые начинаются с чего-то, используя динамическую библиотеку запросов, я ограничен использованием имени столбца и полей в переменных.Я пытался:

var x = myqueriable.Where("" + X1  + " LIKE @0 and "  + X2 + "= @1 ", Y1 + "%", Y2);

У меня есть ошибка: "system.Linq.Dynamic.ParseException: Выражение типа Boolean Ожидается>

Есть ли способ для выполнения упомянутых?

Ответы [ 3 ]

1 голос
/ 19 апреля 2019
var x = myQueryable.Where(y => y.StartsWith(param0));
0 голосов
/ 20 апреля 2019

При использовании System.Linq.Dynamic.Core вы можете использовать StartsWith () .

Пример кода:

var result = Entity1s.Where("Url.StartsWith(\"x\")");

Это переводится на SQL как:

-- Region Parameters
DECLARE @p0 NVarChar(1000) = 'x%'
-- EndRegion
SELECT [t0].[Id], [t0].[Url], [t0].[Rating]
FROM [Entity1] AS [t0]
WHERE [t0].[Url] LIKE @p0
0 голосов
/ 19 апреля 2019

Вам нужно построить динамическое лямбда-выражение, подобное

p => p.Property.StartsWith("some prefix");

Вы можете сделать это без внешних библиотек, используя встроенный API-интерфейс Expressions. Смотрите этот метод расширения:

public static class QueryableExt
{
    public static Expression<Func<T, bool>> BuildLambda<T>(this IQueryable<T> input, string propertyName, string startsWith)
    {
        var elemenType = input.ElementType;
        var property = elemenType.GetProperty(propertyName);
        if (property == null)
            throw new ArgumentException($"There is no property {propertyName} in {elemenType.Name}");
        if (property.PropertyType != typeof(string))
            throw new ArgumentException($"Expected string property but actual type is {property.PropertyType.Name}");

        var startsWithMethod = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });

        var p = Expression.Parameter(elemenType, "p"); // p => ...
        var memberExpression = Expression.Property(p, property); // ... p.Propery
        var startsWithValue = Expression.Constant(startsWith); // "some prefix"
        var startsWithExpression = Expression.Call(memberExpression, startsWithMethod, startsWithValue); // ... p.Property.StartsWith("some prefix")
        var result = Expression.Lambda<Func<T, bool>>(startsWithExpression, p); // p => p.Property.StartsWith("some prefix")

        return result;
    }
}

Обратите внимание, что BuildLambda более безопасен для типов, чем просто конкатенации строк: этот метод фактически проверяет, существует ли propertyName и имеет ли допустимый тип. Теперь вы можете использовать его как

var x = myqueriable.Where(myqueriable.BuildLambda(X, Y))
...