Ошибка результата выражения linq (и анонимного типа)

У меня в классе есть запрос linq. Когда я пытаюсь вернуть тот или иной результат, компилятор выдает ошибку типа преобразования, связанную с «Анонимным типом», и я не нашел для нее решения.

Это мой код:

public static string VerificaExame(string desc)
{
    var model = new ExameContext();
    var res = model.DbExame.Where(exame => exame.Descricao.Trim() == desc.Trim()).Select(exame => new { Id = exame.Id, Codigo = exame.Codigo });
    if (res == null)
        res = model.DbExame.Where(exame => exame.Codigo.Trim() == desc.Trim()).Select(exame => new { Id = exame.Id, Descricao = exame.Descricao });
    var ret = res.FirstOrDefault();
    return JsonConvert.SerializeObject(ret);
}

И сообщение об ошибке:

Недопустимый декларатор члена анонимного типа. Члены анонимного типа должны быть объявлены с назначением члена, простым именем или доступом к члену.

Эта ошибка относится к:

res = model.DbExame.Where(exame => exame.Codigo.Trim() == desc.Trim()).Select(exame => new { Id = exame.Id, Descricao = exame.Descricao });

person GustavoAdolfo    schedule 24.06.2013    source источник
comment
Разве ваша переменная res не возвращает каждый раз другой объект?   -  person Azhar Khorasany    schedule 24.06.2013
comment
На самом деле, ранее определенные члены res не могут быть преобразованы или доступны только для чтения.   -  person GustavoAdolfo    schedule 24.06.2013


Ответы (1)


Используйте другую переменную (не используйте res)

var res = model.DbExame.Where(exame => exame.Descricao.Trim() == desc.Trim()).Select(exame => new { Id = exame.Id, Codigo = exame.Codigo });
//^ Now res is of a specific type (ie: IEnumerable<Anonymous1>)
if (res == null)
    var res2 = model.DbExame.Where(exame => exame.Codigo.Trim() == desc.Trim()).Select(exame => new { Id = exame.Id, Descricao = exame.Descricao });
    //^ you cant affect res2 to res because they are of different type

if (res == null) res никогда не будет нулевым, возможно, вы хотите, чтобы if (!res.Any()) проверял, есть ли у res элементы.


Вот что вам следует сделать:

public static string VerificaExame(string desc)
{
    var model = new ExameContext();
    object res = (object)model.DbExame.Where(exame => exame.Descricao.Trim() == desc.Trim())
                                .Select(exame => new { Id = exame.Id, Codigo = exame.Codigo })
                                .FirstOrDefault()
        ??
        (object)model.DbExame.Where(exame => exame.Codigo.Trim() == desc.Trim())
                        .Select(exame => new { Id = exame.Id, Descricao = exame.Descricao })
                        .FirstOrDefault();

    if (res != null)
        return JsonConvert.SerializeObject(res);
    return JsonConvert.SerializeObject("");//Or throw an exception
}
person Ahmed KRAIEM    schedule 24.06.2013
comment
Да, я даже думал об этом, но я подумал, что может быть другой выход ... Спасибо @ Ahmed-KRAIEM - person GustavoAdolfo; 24.06.2013
comment
О нет :( Оператор '??' не может применяться к операндам типа 'AnonymousType # 1' и 'AnonymousType # 2' - person GustavoAdolfo; 24.06.2013
comment
Thans для всех. Я решаю эту проблему с предложением использовать 2 переменные. ;) - person GustavoAdolfo; 24.06.2013
comment
Да извините, отредактировал (добавлен состав в object). Подумайте о том, чтобы принять ответ. - person Ahmed KRAIEM; 24.06.2013