2015-07-28 5 views
1

Кто-нибудь знает, как я могу запросить переменную, чтобы выбрать имя столбца таблицы? Пример приведен ниже. Вместо Select (x => x.ColumnName), я бы хотел выбрать (поле).LINQ Entity Framework Переменная для выбора db Столбец

public bool isFound(string field, int id) 
{ 
    db.Table.Where(x => x.tableID == id).Select(field).First(); 

    return; 
} 

ответ

0

Это полностью непроверено, и я не уверен в этом, но вы могли бы создать шаблонный метод расширения?

public static IQueryable<T> Select(this IQueryable<T> list, string field) 
{ 
    // Create an Expression and find the property field 
    ParameterExpression pe = Expression.Parameter(typeof(string), field); 

    // Apply the Expression to the IQueryable 
} 

Вот ссылка с некоторыми создания выражения:

https://msdn.microsoft.com/en-us/library/Bb882637.aspx

+0

Хорошее начало :) Полный код здесь http://stackoverflow.com/a/31667061/1019435 –

0

Посмотрите на динамическую библиотеку Linq:

https://www.nuget.org/packages/System.Linq.Dynamic.Library/

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

public static List<string> GetValuesFromDB(string column) 
    { 

     GradInfoEntities db = new GradInfoEntities(); 
     //if i pass the column name in it doesn't work 
     //i suspect that if i pass as param, it gets quoted coz i'm passing in the value, not the column 
     var temp = db.Grads.Where(string.Format("{0} != null", column)).Select(column); 

     List<string> result = temp.Cast<string>().ToList(); 
     return result; 
    } 

Dyamanic Linq Library добавляет перегрузки для где и выбрать (и несколько других, но я использовал только эти два), которые позволяют вам указать, какие столбцы вы хотите выбрать с помощью переданной переменной.

Я отрезала из сортировки и отчетливый звонок, но в основном я возвращающая список строк всех значений, которые не нулевые из принятого в колонке

Edit: Я только что проверил и там не первый(), но есть Take(), и любой()

1

Попробуйте это,

string field = "tableID"; 
ParameterExpression param = Expression.Parameter(typeof(Table), "x"); 
MemberExpression propExpression = Expression.PropertyOrField(param, field); 
Expression<Func<Table, string>> selector = Expression.Lambda<Func<Table, string>>(propExpression, param); 
var result = db.Table.Select(selector).First(); 

Или используйте NuGet пакет DotNetHelper - https://www.nuget.org/packages/DotNetHelper/

Install-Package DotNetHelper 

-

var result = db.users.SelectFirst<Table, string>("Name"); 
+0

Это самая сложная часть. :) Вы можете поместить его в метод расширения, чтобы сохранить желаемый синтаксис Select (string). – Mark

+0

@ Марк, да, правильно! Я просто даю образец. Они могут сделать это способом расширения. –

Смежные вопросы