2013-04-09 5 views
15

Ich habe die folgende Zeile in C#:Linq mit alias

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

mein Problem ist, ich den Alias ​​in meiner where-Klausel verwenden wollen, aber ich kann nicht ‚fullname‘ erscheint als nicht deklariert.

Antwort

29

können Sie let verwenden, um Zwischenwerte zu erstellen:

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

könnte definieren ein Alias ​​für 'fullname'? –

+0

@combo_ci Ich verstehe deine Frage nicht. Genau das macht dieser Code. – cdhowie

6

Sie haben es noch nicht erstellt.

Davon abgesehen, da Sie den Namen im Voraus, sollten Sie die Abfrage auf die Teile ausführen können:

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

Andernfalls Sie let dies tun verwenden können:

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

Sie müssen früher, dass ein Teil des Vorsprungs setzen, die mit einem let clause leicht:

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

Beachten Sie, dass x.name + " " + x.surname wird auf den gleichen Code wie String.Concat(x.name, " ", x.surname) kompiliert werden, aber es ist besser lesbar für die meisten Menschen. Beachten Sie auch, dass Sie nichts außerhalb der () Klammern benötigen.

Ich würde hoffe, dass jeder gute SQL LINQ-Anbieter diese Abfrage in eine sinnvolle und effiziente SQL-Abfrage verwandeln sollte, aber Sie sollten dies selbst überprüfen. Auf der anderen Seite würde ich allgemein vorschlagen, die Abfrage über einzelne Felder, z.B.

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

verwenden, um die let Klausel:

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

Es ist einfacher in der Methode Syntax, da Sie nicht auf die Reihenfolge der Operationen beschränkt sind:

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

könnte einen Alias ​​wie 'نام ونام خانواگیگی' definieren? –