Выбор Entity Framework: могу ли я указать столбцы из словаря?

#asp.net #select #frameworks #entity

#asp.net #выберите #фреймворки #сущность

Вопрос:

Мне интересно, есть ли простой способ сделать это. Я не могу на самом деле написать пакет, потому что он пока не существует в моей работе.

  public ActionResult GetMyData(ICollection<string> MyColumns);
  

который я могу вызвать следующим образом:

 ICollection<string> MyCols = new List<string>();
MyCols.Add("Column1");
MyCols.Add("Column2");
GetMyData(MyCols);
  

Где мой GetMyData запрашивает коллекцию из моей базы данных, выбирая столбцы, указанные в MyCols. Рассмотрим эту коллекцию под названием MyData:

 MyData.Select(s => new { s.Columns1, s.Column2 } 
  

Я знаю, что мой синтаксис там далек от нормы, но на данный момент я не в состоянии исправить.

Существует ли такой метод?

Спасибо!

Комментарии:

1. Почему вы хотите это сделать? Каков контекст? Я сделал что-то подобное для экспорта в CSV, но используя IEnumerable<Выражение<Функция<T, строка>>>. Однако я не вижу привлекательности в создании IEnumerable анонимного типа? Вы можете использовать отражение для идентификации членов класса по имени, но остается большой вопрос, что вы пытаетесь сделать и почему, потому что, вероятно, есть вариант получше.

2. С моего контроллера я вызываю метод, который считывает параметры из строки запроса, чтобы собрать воедино коллекцию объектов. Некоторые из этих объектов являются постоянными, но некоторые нет. Теперь, для некоторых моих элементов управления jQuery, мне нужно только 1 или 2 свойства объектов в этой коллекции. Я хотел бы иметь возможность указывать с помощью строки запроса (или переменных post) строку имен свойств, разделенных запятыми, и проецировать их на набор, а возвращать через JsonResult.

Ответ №1:

Это может помочь в том смысле, что они указывают принцип — вы могли бы создать аналогичный, используя выбранный вами анализатор JSON вместо агрегирования в CSV — в конце концов, JSON — это просто форматированная строка.

Вы бы заменили агрегированную часть чем-то, что построено на JSON. В моем случае значения свойств разделяются запятыми, у вас, очевидно, было бы по-другому.

 <System.Runtime.CompilerServices.Extension()>
Public Function ToCSV(Of T)(source As IEnumerable(Of T), dataFields As IEnumerable(Of Expressions.Expression(Of Func(Of T, String)))) As String()
    Dim compiledFields As IEnumerable(Of Func(Of T, String)) = dataFields.Select(Function(e) e.Compile)
    Return source.
        Select(Function(x) compiledFields.Select(Function(d) d.Invoke(x)).
                   Aggregate(Function(seed, value) seed amp; ", " amp; value)).ToArray
End Function

<System.Runtime.CompilerServices.Extension()>
Public Function ToCSV(Of T)(source As IEnumerable(Of T), dataFields As IEnumerable(Of String)) As String()
    Dim fields = GetType(T).GetProperties().Where(Function(p) dataFields.Any(Function(f) f = p.Name))
    Return source.Select(Function(x) fields.Select(Function(f) f.GetValue(x, Nothing).ToString).
                             Aggregate(Function(seed, value) seed amp; ", " amp; value)).ToArray
End Function
  

Редактировать — вероятно, следует указать, что существует действительно высокая вероятность сбоя, потому что, если вы позволяете пользователям указывать имена свойств, они неправильно их поймут, и они не будут найдены — вы также потенциально создаете проблемы с безопасностью, если ваши таблицы содержат конфиденциальные поля, если вы не добавите какой-либо уровень безопасности для фильтрации этих имен свойств