2017-12-27 20 views
0

私は知りません - IEnumerableのどこの部分で特定のパラメータを渡すことができますか? たとえば、私はこのようなクエリがあります:paramこのIEnumerableでパラメータを設定する方法

e.Number > 5 

のようになります

IEnumerable<Bla> quer = quer.Where(e => e.actual == 1 && param); 

を私はそれがIsNullOrEmptyを通じて多分ジェネリックで行うことができると思いますか?
私はEFで作業しますが、Webフォームです。

public class BLA 
    { 
     [Key] 
     public int IDin { get; set; } 
     public int actual { get; set; } 
     public string code { get; set; }  
     public DateTime Date { get; set; } 

    } 
+0

我々はあなたが 'のFuncとして –

+1

宣言パラメータを扱っているのIEnumerableの種類を確認する必要がありますそれは私のための問題無しです param' –

+0

@OrelEraki - それはどのタイプにすることができます。私はちょうどそれができる方法を知ることはできません - それのアイデア –

答えて

4

あなたは(Func<Bla, bool>は正確に)機能するparamを定義する場合、あなたはそれを呼び出すことができます。

Func<Bla, bool> param = bla => bla.Number > 5; 

そして、それを呼び出す:

IEnumerable<Bla> quer = quer.Where(e => e.actual == 1 && (param?.Invoke(e) ?? true)); 

?? trueあなたは結果をデフォルトすることができますparamnullの場合。 paramnullの場合はtrueが返されますが、希望する場合は変更できます。

EFを実行しているので、上記の方法では使用できません。

Expression<Func<Bla, bool>>を使用できます。式は、実際のSQLへのEFで翻訳することができます。complexer機能については

Expression<Func<Bla, bool>> param = bla => bla.Number > 5; 

IEnumerable<Bla> quer = quer.Where(e => e.actual == 1) 
          .Where(param); 

、あなたが最初の結果を実体化する必要があります。それはときにのみ

IEnumerable<Bla> quer = quer.Where(e => e.actual == 1) 
          .ToList() // materialize 
          .Where(e => param?.Invoke(e) ?? true); 
+0

これは、EFに対してクエリが実行されている場合、これは動作しません。 –

+0

@PeterB私はそれを逃した。更新しました。 –

+0

paramがExpression >の場合、SQLに変換できます。なぜ必要以上のデータを取得し、Expressionを使用するのではなく、Function.Invoke()を往復するのはなぜですか? – DevilSuichiro

0

linqのconditionが常にブール値になるパラメータ。 これはe.actual == 1はtrueまたはflaseのブール結果です。それはまた、ブール値にする必要がありますparamになりますように。 var param = e.Number> 5大丈夫ですが、var param = "e.Number> 5"は大丈夫です。

0

を第二の条件を適用することが可能ですこのように、必要に応じて:あなたもe.Number >一部を変更する必要がある場合

// Always apply first condition: 
IEnumerable<Bla> query = quer.Where(e => e.actual == 1); 

// When needed, also apply second condition: 
int? valueToCheck = someValue; // or null 
if (valueToCheck.HasValue) 
{ 
    query = quer.Where(e.Number > valueToCheck.Value); 
} 

しかし、このアプローチは、従うことはそう簡単ではないだろう。

また、このように少し短く(そしておそらくより読みやすい)に書くことができます。

int? valueToCheck = someValue; // or null 
IEnumerable<Bla> query = quer 
    .Where(e => e.actual == 1); 
    .Where(e => valueToCheck == null || e.Number > valueToCheck.Value); 
+0

今私のコードはこのようなものですが、短くて抽象的にするのが難しいです –

+0

私は短い表記法を追加しました。 –

0

あなたはパラメータを使用し、それがあるので、クエリ

Expression<Func<Bla, bool>> param = bla => bla.Number > 5; 
IEnumerable<Bla> query = query.Where(e => e.actual == 1).Where(param); 

に追加することができます2つの呼び出しの場合、2つ目の呼び出しがnullの場合は、その呼び出しを単に省略することができます。

public void SomeMethod(Expression<Func<Bla, bool>> param) { 
    IEnumerable<Bla> query = quer.Where(e => e.actual == 1).Where(param); 
    if (param != null) { 
     query = query.Where(param); 
    } 
    // ... 
} 

// Usage 
SomeMethod(null); 
// or 
SomeMethod(bla => bla.Number > 5); 
関連する問題