RuntimeBinderException при массовом запросе - PullRequest
1 голос
/ 10 сентября 2011

Почему я получаю исключение связывателя во время выполнения при попытке выполнить следующий запрос в 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».Чтобы получить один результат в моем запросе, мне пришлось изменить его следующим образом:

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 Ответ

2 голосов
/ 10 сентября 2011

Вы передаете аргументы в анонимном объекте, а не в массиве объектов (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});
...