asp.net c#linq从另一个列表中的id基于模型生成列表

时间:2017-10-18 06:37:32

标签: c# asp.net asp.net-mvc linq

我的应用程序是.net Core MVC。我有两个班级

 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。

1 个答案:

答案 0 :(得分: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();