2015-04-10 4 views
0

Я хотел бы передать фильтр как параметр строки.C# orderBy type in string

public static List<Contact> Search(string filtre){ 
    var contacts = bdContext.Contact.OrderBy(e => e.[filtre]).ToList(); 
    return contacts; 
} 

Код:

var contacts = bdContext.Contact.OrderBy(e.GetType().GetProperty(filter)) 
+0

Вы получаете какие-либо ошибки/исключения я не ясно – Reena

+0

Пожалуйста, прочитайте http://stackoverflow.com/help/how-to-ask – goGud

+0

ОК спасибо @goGud –

ответ

0

Вы можете использовать https://www.nuget.org/packages/System.Linq.Dynamic.Library или https://www.nuget.org/packages/System.Linq.Dynamic/ (они представляют собой библиотеку для выполнения «динамических» запросов на основе строковых команд. Они почти эквивалентны, потому что одна является ветвью другого).

using System.Linq.Dynamic; 

, а затем

var contacts = bdContext.Contact.OrderBy(filtre).ToList(); 

Теперь ... если вы действительно не хотите, чтобы включить новую библиотеку, вы можете сделать что-то вроде:

// We build the expression x => x.[filtre] 
var parameter = Expression.Parameter(typeof(Contact)); 
var property = Expression.Property(parameter, filtre); 
var expression = Expression.Lambda(property, parameter); // Returns a Expression<Func<Contact, typeof(propertyName)>> 

// The "right" overload of OrderBy, in a "safe" way 
var orderby = (from x in typeof(Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public) 
       where x.Name == "OrderBy" && x.IsGenericMethod 
       let genericArguments = x.GetGenericArguments() 
       let parameters = x.GetParameters() 
       where genericArguments.Length == 2 && 
        parameters.Length == 2 && 
        parameters[0].ParameterType == typeof(IQueryable<>).MakeGenericType(genericArguments[0]) && 
        parameters[1].ParameterType == typeof(Expression<>).MakeGenericType(typeof(Func<,>).MakeGenericType(genericArguments)) 
       select x).Single(); 

// We build from OrderBy<,> the OrderBy<Contact, typeof(filtre)> 
orderby = orderby.MakeGenericMethod(typeof(Contact), expression.ReturnType); 

// We invoke OrderBy<Contact, typeof(filtre)> 
IQueryable<Contact> ordered = (IQueryable<Contact>)orderby.Invoke(null, new object[] { bdContext.Contact, expression }); 
var contacts = ordered.ToList(); 
+0

Отлично, он работает. : D –

0

Если вы хотите передать фильтр в качестве параметра и получить список, то вам нужно сделать, это:

public static List<Contact> Search(string filtre){ 
    var contacts = bdContext.Contact.where(e => e.columnname.Contains(filtre)).OrderBy(x=>x.ColumnName).ToList(); 
    return contacts; 
} 
0

Вы можете использовать динамический Linq, который доступен по телефону Nuget. Вам нужно будет добавить пространство имен System.Linq.Dynamic, после чего вы сможете передать строку в функцию OrderBy.

using System.Linq.Dynamic; 
... 
public static List<Contact> SearchDynamic(string filtre) 
{ 
    var contacts = Contacts.OrderBy(filtre).ToList(); 
    return contacts; 
} 
... 
Contacts = SearchDynamic("SomeProperty"); 

В качестве альтернативы, вы можете передать Expression<Func<Contact, T>> вашему методу поиска. Это звучит более сложным, чем это:

//no need for Dynamic Linq here 
public static List<Contact> Search<T>(Expression<Func<Contact, T>> filtre) 
{ 
    var contacts = Contacts.OrderBy(filtre).ToList(); 
    return contacts; 
} 
... 
Contacts = Search(c => c.SomeProperty); 
+0

Учитывая, что он использует переменную с именем 'bdContext.Contact', я скажу, что он использует Entity Framework/LINQ2SQL. Таким образом, второй пример был бы лучше, чем выражение > ' – xanatos

+1

Спасибо @xanatos. Я обновил ответ, поскольку предполагаю, что вы правы (хотя вопрос не помечен как таковой). Я отмечаю, что у вас есть «Cast» на вашем ответе - это необходимо для EF, как в моем тесте, с использованием объектов, которые не требуются. – petelids

+0

Отлично, он работает. : D –