web-dev-qa-db-ja.com

変数としてのC#Linq where句

Where句が変数に由来するLINQステートメントを作成しようとしています。例えば:

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 to sqlの例とlinq to objectsの問題に関連する問題があります。

およびmsdnを調べた後の@sLaks http://msdn.Microsoft.com/en-us/library/bb353734.aspx AsQueryableを使用する場所を特定するのに問題があります

おかげで、

41
kds6253

_Expression<Func<T, bool>>_をアセンブリして、Where()拡張メソッドに渡す必要があります。

_Expression<Func<T, bool>> whereClause = a => a.Zip == 23456;
var x = frSomeList.Where(whereClause);
_

[〜#〜] edit [〜#〜]:LINQ to Objectsを使用している場合、Word Expressionを削除して通常のデリゲートを作成します。

66
SLaks

この:

var query = from something in someList where whereClause;

以下の略記です:

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

someListIEnumerable<Address>WhereEnumerable.Where拡張メソッド を指します。このメソッドは、Func<Address, bool>次のように定義できます。

Func<Address, bool> whereClause = address => address.Zip == 23456;
var query = someList.Where(whereClause);
9
dtb

リチャードが指摘したように、動的クエリライブラリを使用して動的フィルタ式を作成できます。 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
afrischke

それはLINQの組み込み機能です。 Where拡張メソッドを使用するだけです。

詳細については、「 LINQクエリ構文とメソッド構文(C#) 」を参照してください。

1
Rob Windsor