我有object CartItem和Product。我需要用这两个对象做一个List<>。
尝试:List<(CartItem,Product)> product = new List<(CartItem,Product)>();
代码:
public async Task<IActionResult> Index()
{
var username = User.Identity.Name;
if (username == null)
{
return Login();
}
var user = _context.Users.FirstOrDefault(x => x.Email == username);
List<CartItem> cart = _context.ShoppingCartItems.Where(s => s.IDuser.Equals(user.Id)).ToList();
List<Product> product = new List<Product>();
foreach (var item in cart)
{
product.Add(_context.Product.FirstOrDefault(x => x.id == item.ProductId));
}
return View(user);
}发布于 2022-12-02 12:19:19
正确的答案是不要这样做。5项和2项产品的预期结果是什么?
代码使用循环从数据库中加载CartItem和Product。这非常慢,因为每个对象都需要另一个查询。这可以替换为生成单个SQL查询的一行。
如果CartItem具有Product和User属性(正如它应该的那样),那么所有代码都可以替换为:
var cart=_context.ShoppingCartItems
.Include(i=>i.Product)
.Where(s=>s.User.Email==userName)
.ToList();EF将生成将用户、CartItem、products连接在一起的SQL查询,并返回项及其产品,但不返回User数据。Product数据可以通过CartItem.Product属性获得。
被问到但不应该使用的
如果绝对需要List<(CartItem,Product)> (为什么??)您可以使用它而不是List<Product>,并在循环中添加项:
// PLEASE don't do it this way
var dontUseThis = new List<(CartItem,Product?)>();
foreach (var item in cart)
{
var product=_context.Product.FirstOrDefault(x => x.id == item.ProductId);
dontUseThis.Add((item,product));
}这将导致每个购物车项增加一个SQL查询。
稍好于
一个稍微好一些的选项是生成一个WHERE product.ID IN (....)子句,在一个查询中加载所有相关产品。在此之后,这两个列表必须与JOIN相结合。
var productIds=cart.Select(c=>c.ProductId);
var products=_context.Product
.Where(p=>productIds.Contains(p.Id))
.ToList();
var dontUseThis = products.Join(cart,
p => p.Id,
c => c.ProductId,
(c, p) => (c,p))
.ToList();这将将N+1查询减少到2。
发布于 2022-12-02 12:30:55
首先,请看“Panagiotis Kanavos”的答案。除此之外,对于组合部分,您可以这样做:
List<CartItem> cartItems; // assuming you already have this
List<Product> products; // assuming you already have this
// The combination part
var result = from p in products
join ci in cartItems on p.Id = ci.ProductId // Find out how product and cartItem relates
select new (p,ci);
// Need List?
var resultingList = result.ToList();发布于 2022-12-02 12:15:31
您可以创建一个结构并将两个变量放入其中:
struct EntireProduct
{
CartItem cartItem;
Product product;
}然后,您可以创建该结构的列表:
List<EntireProduct> product = new List<EntireProduct>();https://stackoverflow.com/questions/74655545
复制相似问题