web-dev-qa-db-fra.com

Linq avec alias

J'ai la ligne suivante en 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) });

mon problème est que je veux utiliser l'alias dans ma clause where, mais je ne peux pas, 'fullName' apparaît comme non déclaré.

18
Jean Paul Olvera

Vous pouvez utiliser let pour créer des valeurs intermédiaires:

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

Vous devez mettre cette partie de la projection plus tôt, ce qui est facile avec une clause 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 };

Notez que x.name + " " + x.surname Sera compilé dans le même code que String.Concat(x.name, " ", x.surname), mais est plus lisible pour la plupart des gens. Notez également que comme vous ne faites rien en dehors des parenthèses (), Elles ne sont pas nécessaires.

Je souhaiterais espérer que tout bon fournisseur SQL LINQ transforme cette requête en une requête SQL sensible et efficace, mais vous devez la valider vous-même. D'un autre côté, je suggérerais généralement de préférer l'interrogation sur des champs individuels, par ex.

where x.name == "Jean Paul" && x.surname == "Olvera"
10
Jon Skeet

Vous ne l'avez pas encore créé.

Cela étant dit, puisque vous connaissez le nom à l'avance, vous devriez pouvoir effectuer la requête sur les pièces:

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

Sinon, vous pouvez utiliser let pour ce faire:

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 ) };
6
Reed Copsey

C'est plus simple dans la syntaxe de la méthode, car vous n'êtes pas contraint à l'ordre des opérations:

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");
4
Servy
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;
            }
3
hadiz7

utilisez la clause 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
D Stanley