Entity Framework Select: Могу ли я указать столбцы из словаря? - PullRequest
0 голосов
/ 03 июня 2011

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

 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 Ответ

0 голосов
/ 03 июня 2011

Это может помочь в том, что они указывают на принцип - вы можете создать аналогичный, используя предпочитаемый вами анализатор 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 & ", " & 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 & ", " & value)).ToArray
End Function

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

...