2011-09-10 21 views
1

Massiveで次のクエリを実行しようとすると、実行時バインダの例外が発生するのはなぜですか? 私は「同上」が返された名前の1つの列のみを確実にするために、私のクエリを変更するために必要な:SOLUTIONを表示するように大量のクエリでRuntimeBinderExceptionが発生する

public dynamic Find(string email, string type) 
    { 
     dynamic result = new ExpandoObject(); 
     result = this.Query(@"SELECT * FROM Addresses a 
      INNER JOIN Members m ON m.Id = a.MemberId 
      INNER JOIN AddressType at ON at.Id = a.AddressTypeId 
      WHERE m.Email = @0 AND at.Type = @1", new {email, type}); 
     return result; 
    } 

EDIT。メンバーとアドレスの複数の列に 'Id'という列があるため、バインドエラーが発生しました。クエリで単一の結果を得るには、これに変更する必要がありました。

result = this.Query(@"SELECT a.* FROM Addresses a 
      INNER JOIN Members m ON m.Id = a.MemberId 
      INNER JOIN AddressType at ON at.Id = a.AddressTypeId 
      WHERE m.Email = @0 AND at.Type = @1", new object[] { email, type }).Single(); 

これは他の人に役立つことを望みます。

+1

あなたは平均 '新しい[] {電子メール、タイプ}'正しいと思いますか? – TheCodeKing

答えて

2

argsをオブジェクト配列(params)の代わりに匿名オブジェクトに渡しています。したがって、最初の引数になり、クエリが2つの引数を必要とするためバインドに失敗します。さらにQueryは返品タイプIEnumerable<dynamic>です。

はこれにあなたのコードを変更

public dynamic Find(string email, string type) 
{ 
    IEnumerable<dynamic> result; 
    result = this.Query(@"SELECT a.* FROM Addresses a 
     INNER JOIN Members m ON m.Id = a.MemberId 
     INNER JOIN AddressType at ON at.Id = a.AddressTypeId 
     WHERE m.Email = @0 AND at.Type = @1", email, type); 

    // decide how you want to handle multiple results here 
    return result.FirstOrDefault(); 
} 

それとも、明示的にオブジェクトの配列を使用できます。

 WHERE m.Email = @0 AND at.Type = @1", new object[] {email, type}); 
+0

私はまだバインディングエラーを取得しています。私はあなたが提案した両方の方法を試しました。 :s – lloydphillips

+0

戻り行でデバッグするとき。私は結果[]にドリルダウンしています。DynamicViewとすべてのプロパティが存在していますが、まだバインディングエラーが発生しています。 SELECT *を複数のIdフィールドを返すように変更する必要があることに気付きました。私は今管理スタジオでSQLをチェックしたところ、それは問題ないと思われます。なぜ私はバインディングエラーをまだ得ているのか分かりません。 – lloydphillips

+0

正確なエラーは何ですか? – TheCodeKing

関連する問題