2017-01-13 27 views
0

私はラムダ式を使用して項目をフィルタリングする句を使用しているオブジェクトの動的リストを持っています。例えば、ちょうど私が項目のリストをフィルタリングしたい場合は今fooが、私は私もでき、次の式where句の動的ラムダ式

var filtered = itemList.Where("!foo"); 

を使用することができます偽であるところ、それは3つのプロパティ、FOO、バー、バズ

class item // let this be current class in dynamic item list 
{ 
    bool foo; 
    string bar; 
    string baz; 
} 

を持っていることを考えますリスト内の項目は空白のNULLでない特定の文字列値を持っている場合、私は実際に確認したい何

var filtered = itemList.Where("bar==\"value\""); \\all items with bar = value 

として文字列値でリストをフィルタリングすることです。私はそれが可能System.String「型の

発現 'System.Func`2 [DynamicType、System.Objectの]は' は型のパラメータのために使用することができないエラーが発生しましたコード

var filtered = itemList.Where("!String.IsNullOrWhiteSpace(baz)"); 

次の試み'メソッドの 'ブール IsNullOrWhiteSpace(可能System.String')

私は、クエリ

に従うことによって、結果を取得することに成功したものの

このクエリでString.IsNullOrWhiteSpace()を使用できる方法があるかどうかを確認したいと考えていました。

+0

文字列の値を変更しているため、文字列をハードコーディングではなく変数にするだけです。 – jdweng

+0

@jdweng、申し訳ありませんが、私はあなたが言っているものを得ていませんでした。 'String.IsNullOrWhiteSpace()'がうまくいかない理由を知りたいだけです –

答えて

0

"!String.IsNullOrWhiteSpace(baz)"を "!(baz == null || baz.Trim()== string.Empty)"に置き換えることができます。

+0

この例を入力してシナリオを提示しましたが、トリムは問題ありません。何を見つけようとしていますか?String.IsNullOrWhiteSpace(baz ) ' –

+0

二重引用符で囲まれているので、文字列です。だからできません:string myString = "!String.IsNullOrWhiteSpace(baz)"; – jdweng

+2

LinqはすべてをSQLに変換して実行することを理解しています。 SQLで認識されない機能は動作しません。 – AndyIZ

0

System.Linq.Dynamicをご覧ください。example hereがあります。あなたがalseます

はそうSystem.Linq.Dynamicプロパティを見つけることができません、List<T>List<object>ではないことを確認する必要があります。ここで

はあなたの例のためのスニペットです:

void Main() 
{ 
    var itemList = new List<dynamic>{ new {foo = true, bar = "a", baz = "b" }, new {foo = true, bar = (string)null, baz = "d" } }; 
    var filtered = itemList.ToAnonymousList().Where("bar != null and bar !=\"\""); 
    filtered.Dump(); 
} 

public static class EnumerableEx { 
    public static IList ToAnonymousList(this IEnumerable enumerable) 
    { 
     var enumerator = enumerable.GetEnumerator(); 
     if (!enumerator.MoveNext()) 
      throw new Exception("?? No elements??"); 

     var value = enumerator.Current; 
     var returnList = (IList) typeof (List<>) 
      .MakeGenericType(value.GetType()) 
      .GetConstructor(Type.EmptyTypes) 
      .Invoke(null); 

     returnList.Add(value); 

     while (enumerator.MoveNext()) 
      returnList.Add(enumerator.Current); 

     return returnList; 
    } 
} 
0

私はあなたの表現を使用して問題はない - それが正常に動作します。

私はこのオブジェクトとエンティティをEFストレージに対して使用しました。

タイプ 'System.Func`2 [DynamicType、System.Objectの]' の発現は は、方法の種類 '可能System.String' のパラメータのために使用できません 'ブール IsNullOrWhiteSpace(可能System.String)'

だから、エラーを見て、それは(周りの順序を移動する)旨さ

Booleanを返すメソッドIsNullOrWhiteSpaceは、タイプSystem.Stringのパラメータを期待しています。 受信したものはExpression of type System.Func``2[DynamicType,System.Object]'

です。比較のために文字列値ではなくオブジェクトを参照しているようです。しかし、使用しているオブジェクトのサンプルコードや、オブジェクト、エンティティ、LinQ to SQL(私が試していないもの)を使用しているかどうかは、あなたが式に指定したものだけを推測することができます。

最後に、 '動的な項目リスト'

何ですか?

Dynamicを使用していますか、それとも普通のList<Item>ですか?

+0

ダイナミック、ノーマルリストなし