С# Linq где предложение как переменная
Я пытаюсь сделать оператор LINQ, где предложение where происходит от переменной. Например:
string whereClause = address.zip == 23456;
var x = from something in someList where whereClause;
Возможно ли это? Кажется, я не могу заставить его работать.
спасибо,
Обновление - мое предложение where предопределено и будет основываться на пользовательском вводе, поэтому я не думаю, что это сработает для меня. В основном whereClause не сконструирован в методе, это параметр метода, который выполняет LINQ. Я не объяснил, что это лучший пример:
public void doLnq(string whereClause)
{
var x = from something in someList where whereClause;
dowork(x);
}
Обновление - просто подытожим некоторые из предложений и централизовать все.
Я не могу использовать переключатель для генерации предложения where, потому что есть способ для многих возможностей.
Динамический пост linq, который некоторые из вас опубликовали, выглядит многообещающим, но у меня возникают проблемы с привязкой linq к sql к моей проблеме linq to objects.
и @sLaks после просмотра msdn http://msdn.microsoft.com/en-us/library/bb353734.aspx Мне трудно понять, где вы собираетесь использовать AsQueryable
спасибо,
Ответы
Ответ 1
Вам нужно собрать Expression<Func<T, bool>>
и передать его методу расширения Where()
:
Expression<Func<T, bool>> whereClause = a => a.zip == 23456;
var x = frSomeList.Where(whereClause);
EDIT. Если вы используете LINQ to Objects, удалите слово Expression
, чтобы создать обычный делегат.
Ответ 2
Это:
var query = from something in someList where whereClause;
является сокращением для:
var query = someList.Where(something => whereClause);
Предполагая, что someList
является IEnumerable<Address>
, Where
относится к Enumerable.Where Extension Method. Этот метод ожидает Func<Address, bool>
, который вы можете определить следующим образом:
Func<Address, bool> whereClause = address => address.Zip == 23456;
var query = someList.Where(whereClause);
Ответ 3
Как отметил Ричард, библиотеку динамических запросов можно использовать для создания динамических выражений фильтра. При использовании Linq-To-Objects обязательно преобразуйте IEnumerable<T>
в IQueryable<T>
. Вот пример (неполный):
using System.Linq.Dynamic;
namespace System.Linq.Dynamic
{
public class Example
{
// Assuming some value is assigned to below field somewhere...
private IEnumerable<Address> m_Addresses;
public void FilterByZipCode(string zipCode)
{
var x = m_Addresses.AsQueryable().Where("Zip == @0", zipCode);
dowork(x);
}
}
public class Address
{
public String Zip { get; set; }
// More Properties...
}
}
Ответ 4
Это встроенная функция LINQ. Просто используйте метод расширения Where.
Подробнее см. Синтаксис запроса LINQ и синтаксис метода (С#).
Ответ 5
Если вы хотите определить предложение Where во время выполнения, вам нужно использовать динамический запрос.
Скотт Гу написал отличный пост об этом здесь: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
Надеюсь, что это поможет.