[英]why does not work OrderBy method in EF core?
我想根據模型中的“ ParamertomId”(表參數),按“值”(表產品參數)獲取排序的產品(表產品)。 如何正確分類相關數據?
這些是我的模型類:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Number { get; set; }
public double Amount { get; set; }
public double PrimeCostEUR { get; set; }
[ForeignKey("ProductTypeId")]
public int ProductTypeId { get; set; }
public virtual ProductType ProductType { get; set; }
public ICollection<ProductParameter> ProductParameters { get; set; } = new List<ProductParameter>();
}
public class ProductType //: BaseObject
{
public int Id { get; set; }
public string NameType { get; set; }
public ICollection<Parameter> Parameters { get; set; } = new List<Parameter>();
public ICollection<Product> Products { get; set; } = new List<Product>();
}
public class Parameter
{
public int Id { get; set; }
public string Name { get; set; }
[ForeignKey("ProductType")]
public int ProductTypeId { get; set; }
public virtual ProductType ProductType { get; set; }
public ICollection<ProductParameter> ProductParameters { get; set; } = new List<ProductParameter>();
}
public class ProductParameter
{
public int Id { get; set; }
public int ProductId { get; set; }
public virtual Product Product { get; set; }
public int ParameterId { get; set; }
public virtual Parameter Parameter { get; set; }
public string Value { get; set; }
}
這些是顯示我所需數據所需的DTO類:
public class ProductDTO{
public int ProductId { get; set; }
public string Number { get; set; }
public double Amount { get; set; }
public double PrimeCostEUR { get; set; }
public int ProductTypeId { get; set; }
public string NameType { get; set; }
public ICollection<ParameterDTO> Parameters { get; set; } = new
List<ParameterDTO>();}
public class ParameterDTO {
public int Id { get; set; }
public string Name { get; set; }
public string Value { get; set; }
}
我從三個表接收相關數據。 我的方法GetSortedProducts:
public async Task<IEnumerable<ProductDTO>> GetProducts(int id)
{
var typeParams = _context.Parameters
.Where(t => t.ProductTypeId == id)
.ToList();
var products = _context.Products
.Include(t => t.ProductParameters)
.Where(t => t.ProductTypeId == id)
.ToList();
var items = new List<ProductDTO>();
foreach (var product in products)
{
var productDTO = new ProductDTO()
{
ProductId = product.Id,
Number = product.Number,
Amount = product.Amount,
PrimeCostEUR = product.PrimeCostEUR,
ProductTypeId = product.ProductTypeId
};
foreach (var typeParam in typeParams)
{
var paramDTO = new ParameterDTO();
var value = product.ProductParameters.FirstOrDefault(t => t.ParameterId == typeParam.Id);
if (value != null)
{
paramDTO.Id = value.Id;
paramDTO.Value = value.Value;
}
paramDTO.ParameterId = typeParam.Id;
paramDTO.Name = typeParam.Name;
productDTO.Parameters.Add(paramDTO);
}
// sort products by value
productDTO.Parameters.Where(y => y.ParameterId == 4)
.OrderBy(t => t.Value).ToList();
items.Add(productDTO);
}
return items;
}
這是行不通的,因為LINQ 永遠不會影響原始集合,因此這根本沒有做任何事情:
productDTO.Parameters
.Where(y => y.ParameterId == 4)
.OrderBy(t => t.Value)
.ToList();
總體而言,該代碼甚至與優秀代碼也不相近。 不要僅將Product
(和其他)對象轉換為DTO版本。 正確使用實體框架:
var products = await _context.Products
.Where(prod => prod.ProductTypeId == id)
.Select(prod => new ProductDTO
{
ProductId = prod.ProductId,
// rest of properties...
// now get the parameters
Parameters = prod.Parameters
// assuming you want to order by value, the question isn't very clear
.OrderBy(par => par.Value)
.Select(par => new ParameterDTO
{
Id = par.Id,
// etc
})
.ToList()
})
.ToListAsync();
當數據已在內存中時 ,將單個數據庫查詢與問題代碼正在執行的多個調用進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.