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");