Linq с псевдонимом

У меня есть следующая строка в С#:

var name = (from x in db.authors
                    where fullName == "Jean Paul Olvera"
                    orderby x.surname
                    select new { x.id_author, fullName= String.Concat(x.name," ", x.surname) });

Моя проблема в том, что я хочу использовать псевдоним в предложении where, но не могу, 'fullName' появляется как не объявленный.

Ответы

Ответ 1

Вы можете использовать let для создания промежуточных значений:

var name = (from x in db.authors
            let fullName = x.name + " " + x.surname
            where fullName == "Jean Paul Olvera"
            orderby x.surname
            select new { x.id_author, fullName });

Ответ 2

Вам нужно поставить эту часть проекции раньше, что легко с помощью let предложение:

var name = from x in db.authors
           let fullName = x.name + " " + x.surname
           where fullName == "Jean Paul Olvera"
           orderby x.surname
           select new { x.id_author, fullName };

Обратите внимание, что x.name + " " + x.surname будет скомпилирован с тем же кодом, что и String.Concat(x.name, " ", x.surname), но более читабельен для большинства людей. Также обратите внимание, что поскольку вы ничего не делаете вне скобок (), им не нужно.

Я хотел бы надеяться, что любой хороший поставщик SQL LINQ должен превратить этот запрос в разумный и эффективный SQL-запрос, но вы должны его проверить самостоятельно. С другой стороны, я обычно предлагаю предпочесть запросы на отдельные поля, например.

where x.name == "Jean Paul" && x.surname == "Olvera"

Ответ 3

Вы еще не создали его.

С учетом того, что вы знаете имя заранее, вы должны иметь возможность выполнить запрос по частям:

var name = from x in db.authors
                where name == "Jean Paul" && surname == "Olvera"
                orderby x.surname
                select new { x.id_author, fullName= String.Concat(x.name," ", x.surname) };

В противном случае вы можете использовать let для этого:

var name = from x in db.authors
           let fullName = String.Concat(x.name," ", x.surname)
           where fullName == "Jean Paul Olvera"
           orderby x.surname
           select new { x.id_author, fullName=fullName ) };

Ответ 4

linq1DataContext ll = new linq1DataContext();
            if (comboBox1.SelectedIndex == 0)
            {

                var q = from m in ll.personals                            



                        let کد= m.id
                        let نام = m.name

                        select new { 
                                     کد,
                                     نام,
                        };
                dataGridView1.DataSource = q;
            }

Ответ 5

используйте предложение let:

var name = (from x in db.authors
                let fullName = String.Concat(x.name," ", x.surname)
                where fullname = "Jean Paul Olvera"
                orderby x.surname
                select new { x.id_author, fullName });

Ответ 6

Это проще в синтаксисе метода, так как вы не ограничены порядком операций:

var query = authors.OrderBy(x => x.surname)
    .Select(x => new
    {
        x.id_author,
        fullName = String.Concat(x.name, " ", x.surname)
    })
    .Where(x => x.fullName == "Jean Paul Olvera");