2012-02-24 13 views
5

私は動的にLINQ文を構築しています。作成しているLINQステートメントは、WHERE句にのみ使用されます。動的LINQ - GUIDと文字列の間で変換できません

string[] values = GetPropertyValues(); 
string propertyName = GetPropertyName(); 

string clause = string.Empty; 
if (values.Length > 0) 
    clause = propertyName + "==\"" + values[0] + "\""; 

私の知る限りでは、LINQクエリは正しいと見なされます。しかし、実行されると、次のようなエラーが表示されます。

オペランド '=='オペランドの種類と互換性がありません 'Guid?'と '文字列'

この問題をどのように修正できますか?

ありがとうございました!

+0

はこちらをご覧:http://weblogs.asp.net/ scottgu/archive/2008/01/07/dynamic-linq-part-1-using-linq-dynamic-query-library.aspx –

+0

値とpropertyNameのサンプルデータを提供しますか? –

答えて

0

GetPropertyName()が返すプロパティはGuid型(エラーであると思われます)ですが、文字列として宣言する値[0]の内容と比較しようとしているようです。

ダイナミックLINQのは、あなたがYourTypeソースIQueryable内のアイテムの種類である

string clause = propertyName + "= @1"; 
LambdaExpression expr = Dynamic.ParseLambda(typeof(YourType), typeof(bool), clause, values[0]); 

を行うことができますので、あなたのwhere句にパラメータを定義することができます。たとえば、ソースクエリがIQueyable<Customer>の場合、YourTypeCustomerとなります。これは、propertyNameで示されるプロパティの種類が何であっても機能します。

ダイナミックLinqは、解析を実行するときに、ラムダ式の型引数がYourTypepropertyNameの反射を使用するべきであると判断します。あなたが得るラムダ式は、.Where()拡張メソッドのパラメータとして使うべきものです。

+1

+1これは正解です( 'Where'拡張メソッドも名前付きパラメータをサポートしているので、この静的メソッドを呼び出す必要はありません)。 OPがやっていることとこれが(私が指摘したいと思う)実際の違いは、この場合の* value *はもう文字列でなくてもいいということです。これは実際の 'Guid'インスタンスになります。その場合、 'GetPropertyValues()'は文字列表現ではなく実際の値を返す必要があります。 – Groo

+0

かなり正しいです。 GetPropertyValuesはstring []ではなくobject []型である必要があります。 –

3

NULL可能な値については、このようなものは動作します:

が、それは明らかではなく、特定のケースです。

AlbahariのPredicateBuilderはもっと良い解決策かもしれません。

+0

GetPropertyName()は文字列以外のオブジェクトを返すことがあります。だから私はそれが文字列でなければならないと思いますpropertyName = GetPropertyName()。ToString(); –

+0

@Love:実際には、プロパティ名を文字列形式( '' Id "')で返すと思います。これは基本的に動的な 'where'節を作成する必要があります(特定のプロパティの値を別の値と比較するため)。しかし、動的LINQが式をコンパイルするとき、 'Id'(これは' Nullable ')の値を' String'と比較することはできません。 – Groo

+1

あなたはちょうど私の日を救った。私は今ピクニックのために子供たちと一緒に行くことができます:D –

5

GUIDと動的linqとの比較クエリプロパティと、提供されているサンプルのようなEquals()メソッド。あなたは、パラメータとしてguidを渡すたくない場合は

var items = new[] 
      { 
       new { Id = Guid.Empty }, 
       new { Id = Guid.NewGuid() }, 
       new { Id = Guid.NewGuid() } 
      }; 

var result = items.AsQueryable() 
    .Where("Id.Equals(@0)", Guid.Empty) 
    .Any(); 
0

、あなたは文字列とGUID比較のためにそれを使用することができます作品です

clause = "Id.Value.Equals(Guid(\"" + values[0] + "\"))"; 

を。

...またはそれはあなたの例である:

clause = propertyName + ".Value.Equals(\"" + values[0] + "\")"; 
5
動作しない "価値" を持つパラメータ

"Id.Equals(Guid(\"D243372F-7ED0-40E6-B93D-6165F7521C29\"))" 

のない私にとって

作品。エラーつくれ

"{いいえプロパティまたはフィールド '値が' 型では存在しない(インデックス3時) 'のGuid'}"

関連する問題