Динамический запрос набора данных с использованием Linq - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть набор данных, который я хотел бы запросить динамически.Этот код работает нормально, если я явно определяю имя поля, но я не хочу этого делать.Я хочу динамически запрашивать данные, используя переменную для имени поля.Как мне подходить к этому?

Это работает:

var dataField = "DemandStatusName";
var searchParam = form.GetValues("columns[" + j + "][search][value]").FirstOrDefault();

if(searchParam != "")
{
    dataSet = (from a in dataSet
               where a.DemandStatusName.Contains(searchParam)
               select a);
}

Но это не так:

var dataField = "DemandStatusName";
var searchParam = form.GetValues("columns[" + j + "][search][value]").FirstOrDefault();

if(searchParam != "")
{
    dataSet = (from a in dataSet
               where dataField.Contains(searchParam)
               select a);
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Как мне подходить к этому?

Одним из главных преимуществ LINQ является то, что вы получаете безопасность типов.Запрашивая его динамически, вы по сути теряете это преимущество.Хотя это не совсем «динамично», вы можете воспользоваться этим преимуществом, написав метод расширения, который включает в себя конкретные поля, которые вы хотите запросить:

public static IQueryable<MyTable> WhereContains(this IQueryable<MyTable> source, string field, string value)
{
  switch (field)
  {
    case nameof(MyTable.SomeField):
      return source.Where(a => a.SomeField.Contains(value));
    case nameof(MyTable.SomeOtherField):
      return source.Where(a => a.SomeOtherField.Contains(value));
    // ... etc
    default:
      throw new ArgumentOutOfRangeException($"Unexpected field {field}");
  }
}

Таким образом, ваш код может вызвать следующее:

var dataField = "DemandStatusName";
var searchParam = form.GetValues("columns[" + j + "][search][value]").FirstOrDefault();

dataset.WhereContains(dataField, searchParam).OrderBy(a => a.Whatever)

При этом, буквально отвечая на ваш вопрос, вы технически можете динамически создавать выражение LINQ.Это может выглядеть примерно так, но имейте в виду, что производительность будет низкой, а неожиданные значения могут ее сломать и / или открыть некоторые уязвимости безопасности, особенно если они исходят от ввода пользователя:

var table = Expression.Parameter(typeof(MyTable));
var property = Expression.PropertyOrField(table, dataField);
var param = Expression.Constant(searchParam);
var contains = Expression.Call(property, "Contains", Type.EmptyTypes, searchParam);
var expression = Expression.Lambda<Func<MyTable,bool>>(contains, table);

var result = dataset.Where(expression);
0 голосов
/ 07 февраля 2019

Нужно ли использовать LINQ?Динамический SQL (с параметрами) будет намного проще.

var dataField = "DemandStatusName";
var searchParam = form.GetValues("columns[" + j + "][search][value]").FirstOrDefault();
var sql = string.Format("select * from tableName where {0} = @param", dataField);

if(searchParam != "")
{
    dataSet = context.Database.SqlQuery<YourEntity>(sql,
                  new SqlParameter("param", searchParam));
}
...