web-dev-qa-db-fra.com

Sélection de plusieurs colonnes avec une requête linq et une expression lambda

Je suis nouveau sur C # ASP.NET et je travaille sur ma première application.

J'essaie de créer une déclaration linq qui renvoie un araire.

J'ai une table de produits. Je veux pouvoir sélectionner un nom, un identifiant et un prix pour chaque produit dont le statut == 1.

Je ne parviens pas à créer un moyen de le faire ..__J'ai seulement pu retourner des éléments/colonnes individuels. Je suis resté coincé trop longtemps.

C'est ce que j'ai jusqu'ici:

try
{
  using (UserDataDataContext db = new UserDataDataContext())
  {
    return db.mrobProducts.Select(x => x.Name).OrderBy(x => x).ToArray();
  }
}

Si vous regardez dans la capture d'écran ci-dessous, vous pouvez voir que j'ai deux erreurs, Select = Le type objet ne peut pas être référé à partir de son utilisation ToArray = ne peut pas résoudre le symbole en tableau

enter image description here

12
Mark

Vous n'êtes pas sûr de la structure de votre table, mais voyez ci-dessous.

public NamePriceModel[] AllProducts()
{
    try
    {
        using (UserDataDataContext db = new UserDataDataContext())
        {
            return db.mrobProducts
                .Where(x => x.Status == 1)
                .Select(x => new NamePriceModel { 
                    Name = x.Name, 
                    Id = x.Id, 
                    Price = x.Price
                })
                .OrderBy(x => x.Id)
                .ToArray();
         }
     }
     catch
     {
         return null;
     }
 }

Cela renverrait un tableau de type anonyme avec les membres dont vous avez besoin.

Mettre à jour:

Créer une nouvelle classe.

public class NamePriceModel 
{
    public string Name {get; set;}
    public decimal? Price {get; set;}
    public int Id {get; set;}
}

J'ai modifié la requête ci-dessus pour le renvoyer également et vous devriez remplacer votre méthode par string[] par NamePriceModel[].

26
scartag

Vous pouvez utiliser:

public YourClass[] AllProducts()
{
    try
    {
        using (UserDataDataContext db = new UserDataDataContext())
        {
            return db.mrobProducts.Where(x => x.Status == 1)
                           .OrderBy(x => x.ID)
                           .Select(x => new YourClass { ID = x.ID, Name = x.Name, Price = x.Price})
                           .ToArray();
        }
    }
    catch
    {
        return null;
    }
}

Et voici la mise en œuvre YourClass:

public class YourClass
{
  public string Name {get; set;}
  public int ID {get; set;}
  public int Price {get; set;}
}

Et le type de retour de votre méthode AllProducts doit être YourClass[].

10
Farhad Jabiyev

en utilisant LINQ et Lamba, je voulais renvoyer deux valeurs de champ et l’affecter à un champ d’objet entité unique;

comme Nom = Fname + "" + LName;

Voir mon code ci-dessous qui fonctionne comme prévu; espérons que cela est utile;

Myentity objMyEntity = new Myentity
{
id = obj.Id,
Name = contxt.Vendors.Where(v => v.PQS_ID == obj.Id).Select(v=> new { contact = v.Fname + " " + v.LName}).Single().contact
}

pas besoin de déclarer le 'contact'

3
Muru Bakthavachalam
        Object AccountObject = _dbContext.Accounts
                                   .Join(_dbContext.Users, acc => acc.AccountId, usr => usr.AccountId, (acc, usr) => new { acc, usr })
                                   .Where(x => x.usr.EmailAddress == key1)
                                   .Where(x => x.usr.Hash == key2)
                                   .Select(x => new { AccountId = x.acc.AccountId, Name = x.acc.Name })
                                   .SingleOrDefault();