Подтвердить что ты не робот

С# 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

спасибо,

4b9b3361

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