C # Linq, где предложение как переменная - PullRequest
41 голосов
/ 04 января 2012

Я пытаюсь сделать оператор LINQ, где предложение where происходит из переменной. Например:

string whereClause = address.zip == 23456;
var x = from something in someList where whereClause;

Возможно ли это? Я не могу заставить его работать.

спасибо,

Обновление - мое предложение where предопределено и будет основано на пользовательском вводе, поэтому я не думаю, что это будет работать для меня. В основном, где в методе не создается Clause, это параметр метода, который выполняет LINQ. Я не объяснил это хорошо, вот лучший пример:

public void doLnq(string whereClause)
{
   var x = from something in someList where whereClause;
   dowork(x);
}

Обновление - просто, чтобы суммировать некоторые из предложений и централизовать все.

Я не могу использовать ключ для генерации предложения where, потому что есть много возможностей.

Динамический пост linq, который опубликовали некоторые из вас, выглядит многообещающе, но у меня возникают проблемы, связанные с примером linq to sql с моей проблемой linq to objects.

и @sLaks после просмотра msdn http://msdn.microsoft.com/en-us/library/bb353734.aspx У меня проблемы с выяснением того, где вы хотели использовать AsQueryable

спасибо,

Ответы [ 4 ]

66 голосов
/ 04 января 2012

Вам необходимо собрать Expression<Func<T, bool>> и передать его методу расширения Where():

Expression<Func<T, bool>> whereClause = a => a.zip == 23456;
var x = frSomeList.Where(whereClause);

EDIT : если вы используете LINQ to Objects, удалитеслово Expression для создания обычного делегата.

9 голосов
/ 04 января 2012

Это:

var query = from something in someList where whereClause;

является сокращением для:

var query = someList.Where(something => whereClause);

Предполагается, что someList является IEnumerable<Address>, Where относится к расширению Enumerable.WhereМетод .Этот метод ожидает Func<Address, bool>, который вы можете определить следующим образом:

Func<Address, bool> whereClause = address => address.Zip == 23456;
var query = someList.Where(whereClause);
4 голосов
/ 04 января 2012

Как отметил Ричард, динамическая библиотека запросов может использоваться для построения выражений динамических фильтров. При использовании 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...  
  }
}
1 голос
/ 04 января 2012

Это встроенная функция LINQ. Просто используйте метод расширения Where.

См. Синтаксис запроса LINQ против синтаксиса метода (C #) для получения дополнительной информации.

...