2015-02-25 2 views
0

Я перестраиваю нашу систему отчетности с помощью EF, где, поскольку наша старая система использовала много динамического SQL (плохой я знаю), поэтому я хотел бы сделать это с помощью Linq, поэтому он использует параметризованные запросы и т. д.Выбор конкретных столбцов с помощью Linq, используя строку или propertyInfo

В отчете пользователь может выбрать, какие столбцы данных они хотят просмотреть. Теперь, как я могу взять эти значения и вернуть SQL-оператор с помощью Linq и получить столбцы, которые мне нужны? Интересно, нужно ли мне даже беспокоиться и просто возвращать все данные, а затем просто показывать столбцы, которые пользователь хочет на экране, что может быть нужно, мне нужно сделать, но я думал, что все равно спрошу.

Так что давайте возьмем следующий пример Linq, я скажу, что мне бы хотелось только Id, Name и Town, как я мог это сделать. В настоящее время у меня есть что-то похожее на

var columns = new List<string>() { "Id", "Name", "Town" }; 

return _context.Data 
    .Where(e => e.Name == "test") 
    .ToList(); 

Возможно ли это?

+1

Это может дать вам представление о том http://tomasp.net/blog/dynamic-linq-queries.aspx/ –

ответ

1

если вы Янт выберите propertys Соответствии их имена пытаются Dynamic LINQ библиотека:

public List<Data> ListByNames(string[] arr) 
{ 
    var str = string.Format("new ({0})", string.Join(", ", arr)); 
    return _context.Data.Select(str); 
} 

Или написать свой собственный Expression, см @TomBrothers ответ: https://stackoverflow.com/a/4546633/1271037

-1

Я знаю, что такого рода проблемы. Основная проблема: с EF вы больше не обрабатываете столбцы, а свойства.

Попробуйте Somthing так:

var column="yourcolumn"; 
return _context.Data.Where(e => e.GetType().GetProperty(column).GetValue(_context, null)).ToList(); 
+0

Вы не можете использовать 'Reflection' в' EF'. – dovid

+0

Да, вы можете, как только вы используете модель вместо контекста. Я использую отражение непосредственно на EF-модели. – LocEngineer

+0

Значит, вместо возвращаемого _context.Data ... вам, вероятно, нужно сначала установить var data = _context.Data, затем var result = data.Where (...), а затем вернуть результат. – LocEngineer