带别名的Linq
本文关键字:Linq 别名 | 更新日期: 2023-09-27 18:08:30
我在c#中有以下行:
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'显示为未声明。
您可以使用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 });
您需要更早地放置投影的这一部分,这很容易使用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"
您还没有创建。
话虽这么说,由于您提前知道了名称,因此您应该能够对以下部分执行查询:
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 ) };
在方法语法中更容易,因为您不受操作顺序的限制:
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");
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;
}
使用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 });