gpt4 book ai didi

linq - 使用 DefaultIfEmpty 改进 Linq 子查询

转载 作者:行者123 更新时间:2023-12-02 04:07:17 27 4
gpt4 key购买 nike

我有以下数据库结构(简化)

店铺

StoreId
RateId

产品
ProductId
Name

费率
RateId
Name
IsDefault

价格
PriceId
ProductID
RateId
UnitPrice

我有产品,根据费率表,每个产品都可以有多个价格。我有多个商店,每个商店都有一个默认费率(rateId)。如果在给定费率 (rateId) 的价格表中没有找到产品的价格,则返回默认 rateId 和 Product 的价格。

现在是 UI 代码:
    public ActionResult All() {

// Retrieve all products from database
var products = db.GetAllStoreProducts(StoreSettings.Default.StoreId)
.OrderBy(p => p.DateCreated);

var viewModel = new StoreBrowseViewModel() {
Name = "Todos los Productos",
Description = "Todos los Productos que forman parte de nuestro catálogo",
StoreProducts = products.ToList()
};

return View("Browse1", viewModel);
}

Linq 代码:
    public IQueryable<Product> GetProducts() {

return storeDB.Products
.Include("Price");
}

public IQueryable<StoreProduct> GetAllStoreProducts(Guid storeId) {

var store = storeDB.Stores
.SingleOrDefault(s => s.StoreId == storeId);

var products = GetProducts()
.Where(p => p.Visible)
.OrderBy(p => p.Name)
.Select(p => new StoreProduct() {
Family = p.Family,
Category = p.Category,
MetricType = p.MetricType,
Name = p.Name,
PublicArtUrl = p.ProductArtUrl,
DateCreated = p.DateCreated,
DateUpdated = p.DateModified,
UnitPrice = p.Prices
.Where(pc => pc.Rate.RateId == store.RateId)
.Select(b => b.UnitPrice)
.DefaultIfEmpty(p.Prices.FirstOrDefault(p2 => p2.Rate.IsDefault).UnitPrice)
.FirstOrDefault()
});

return products;
}

代码工作正常,我得到给定商店的正确价格或默认价格,如果没有找到“覆盖”但是......有什么想法可以提高 linq 查询的性能吗? (不想使用sproc)

最佳答案

  • 您正在执行 2 个查询,这些查询可以合并为一个。
  • 您仅为 RateId 属性选择整个商店实体。

  • 还:
    我们使用以下规则来创建非常高性能的 linq 查询:
  • Use compiled queries
    它极大地提高了查询性能。它提供了查询的编译和缓存以供重用。查询编译一次后,您的程序可以使用其他参数执行它。
  • 选择 PresentationModels而不是实体。实体比代表实体的简单类重得多。
  • 永远不要使用“包含”。这是一个真正的性能 pig 。只需创建一个查询即可一次获取所有信息。
  • 关于linq - 使用 DefaultIfEmpty 改进 Linq 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6940238/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com