1

Massive で次のクエリを実行しようとすると、ランタイム バインダー例外が発生するのはなぜですか?

  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;
    }

解決策を表示するように編集:「Id」という名前の列が 1 つだけ返されるように、クエリを変更する必要がありました。メンバーとアドレスの複数の列に「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();

これが他の誰かに役立つことを願っています。

4

1 に答える 1

2

オブジェクト配列 (params) ではなく、匿名オブジェクトで引数を渡しています。したがって、クエリが 2 つの引数を想定しているため、最初の引数になり、バインドに失敗します。さらに、Querytype を返します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});
于 2011-09-10T19:14:51.517 に答える