2013-04-09 47 views
15

我在C#中的以下行: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子句中,但我不能,“全名”显示为不可声明。

回答

29

您可以使用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 }); 
+0

可以定义“fullname”的别名? – 2017-07-18 17:07:28

+0

@combo_ci我不明白你的问题。这正是这个代码所做的。 – cdhowie 2017-07-19 02:22:34

6

你还没有创建它。

话虽这么说,因为你事先知道名字,你应该能够对各部分进行查询:

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) }; 
10

你需要把前面投影的那部分,这是很容易与let clause

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" 
2

使用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 }); 
2

它在方法的语法更容易,因为你不会受限于操作的顺序:

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"); 
3
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; 
      } 
+0

可以定义一个别名,例如'نامونامخانوادگی'? – 2017-07-18 17:10:10