2017-10-18 39 views
1

我的应用程序是.net核心MVC。我有两个类asp.net c#linq从模型库生成列表从另一个列表中的编号

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

我想用下面生成的产品名称的列表:

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

虽然我已经在列表(产品)3项,我得到的只是一个项目产品名称列表。

注意:我无法使用Include,因为我使用另一个Core Web API检索数据,并且 无法使用oData返回IQueryable对象。所以作为一种解决方法,我是 使用Sqlite作为客户端应用程序,而API使用MS Sql。

+0

@StephenMuecke简化这个,谢谢。它效果很好。 – hncl

+0

所以用绿色的勾子检查他的答案 – GGO

回答

1

因为您在每次迭代中都会覆盖productnames的值,所以只能得到一个项目(这将是上次迭代的值)。

您需要将结果添加到列表中。假设你.Where(c => c.ProductId == item.ProductId)只返回一个记录,那么你可以使用.Single(),例如

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

但是,您可以通过使用.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();