2017-10-18 7 views
1

Mon application est .net Core MVC. J'ai deux classesasp.net C# linq générer la liste à partir de la base du modèle sur l'ID d'une autre liste

public class Product 
    { 
     public int Id { get; set; } 
     public string Buyer { get; set; } 
     public int? ProductId { get; set; } 

     public ProductType ProductType { get; set; } 
    } 

public class ProductType 
    { 
     public int ProductId { get; set; } 
     public string ProductName { get; set; } 

     public ICollection<Product> Product { get; set; } 
    } 

Je suis en train de générer une liste de nom de produit en utilisant les éléments suivants:

List<ProductType> productnames; 
var products = _context.Product().Where(x => x.Buyer == "Test" && x.ProductId != null).ToList(); 
foreach (var item in products) 
{ 
productnames = _context.ProductType.Where(c => c.ProductId == item.ProductId).ToList(); 
} 

Bien que j'ai 3 éléments dans la liste (produits), je reçois un seul élément dans Liste des noms de produits

Note: Je ne peux pas utiliser parce que je suis Inclure en utilisant une autre base API Web pour récupérer les données et ne peuvent pas utiliser oData pour retourner l'objet IQueryable. Donc, comme une solution de contournement, je suis en utilisant Sqlite pour l'application cliente, tandis que l'API utilise MS Sql.

+0

@StephenMuecke, je vous remercie. Ça a bien marché. – hncl

+0

Alors vérifiez sa réponse avec la coche verte – GGO

Répondre

1

Vous obtenez uniquement un élément (qui correspond à la valeur de la dernière itération) car vous continuez d'écraser la valeur productnames à chaque itération.

Vous devez ajouter le résultat à la liste. En supposant que votre .Where(c => c.ProductId == item.ProductId) ne renvoie qu'un seul enregistrement, vous pouvez ensuite utiliser .Single(), par exemple

foreach (var item in products) 
{ 
    productnames.Add(_context.ProductType.Single(c => c.ProductId == item.ProductId)); 
} 

Cependant, vous pouvez simplifier cela en utilisant une déclaration .Contains()

// Select just the ProductId 
var products = _context.Product 
    .Where(x => x.Buyer == "Test" && x.ProductId != null) 
    .Select(x => x.ProductId); 
List<ProductType> productnames = _context.ProductType 
    .Where(x => products.Contains(x.ProductId)).ToList();