首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用DefaultIfEmpty改进Linq子查询

用DefaultIfEmpty改进Linq子查询
EN

Stack Overflow用户
提问于 2011-08-04 19:01:54
回答 1查看 1.6K关注 0票数 3

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

商店

代码语言:javascript
复制
StoreId
RateId

产品

代码语言:javascript
复制
ProductId
Name

费率

代码语言:javascript
复制
RateId
Name
IsDefault

价格

代码语言:javascript
复制
PriceId
ProductID
RateId
UnitPrice

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

现在是UI代码:

代码语言:javascript
复制
    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代码:

代码语言:javascript
复制
    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;
    }

代码运行良好,我正在获取给定商店的正确价格或默认价格,如果没有找到'override‘,但是...有什么办法可以提高linq查询的性能吗?(不想使用存储过程)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-04 19:19:57

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

另外:我们使用了以下规则来创建非常高性能的linq查询:

  • Use compiled queries它极大地提高了查询性能。它提供查询的编译和缓存以供重用。在编译完查询之后,您的程序只能使用其他参数来执行它。
  • 选择PresentationModels而不是entities。实体比表示您的entities.
  • Never使用"Include“的简单类要重得多。这是一个真正的性能猪。只需创建一个查询,一次获取所有信息。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6940238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档