2013-04-09 46 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