简而言之,我的问题是显示每个过滤器可用的项目数。
我有以下实体:
当然,我还有其他实体,比如标签,为了简化操作,我删除了这些实体。
public class Category {
public int Id {get; set;}
public int? ParentId {get; set;}
public string Name {get; set;}
}
public class Product {
public int Id { get; set; }
public int CategoryId { get; set; }
public int SubcategoryId { get; set; }
public string Title { get; set; }
public bool IsPaid { get; set; }
public string Level { get; set; }
public string Grade { get; set; }
}
我的目标是创建一个类似于你在Udemy上看到的搜索页面:
正如您在链接页面上看到的,当用户选择了一个类别或子类别时,还会显示其他子类别中的项目数。或者在基于Free
筛选项目时,也可以看到Paid
项目的数量。
我认为唯一的方法是使用多个查询。以使所有过滤器应用一次以获得搜索结果的方式。然后,要获得与每个过滤器相关的项目数,请通过应用除该过滤器之外的所有过滤器并使用按该过滤器分组(和计数(来运行查询!
有更好的方法吗?
考虑到必要查询的数量,从数据库中读取一个类别中所有项目的全部数据并在内存中执行其他查询不是更好吗?
我应该提到的是,我的项目(当然还有Udemy(中的项目数量很大!例如,一个类别中可能有10000个甚至更多的项目。
我正在使用ASP。NET&C#;NHibernate作为ORM。我想使用LINQ(IQueryable(进行查询。
如果有人能够编写一个示例查询,那将非常有帮助。
更新:我不认为这个问题是基于观点的!
我有一个问题是关于这两种方法在科学和实践上的区别。
我准确地描述了这个项目和我所做的工作。
现在,我的问题正是关于接收所有数据和在内存中查询,或者多次查询和接收较少数据的效率差异。
当我们谈论特定的技术和实体时,我不认为这个问题会受到人们的意见的影响。从科学的角度来看,这个问题可以由有足够知识和经验的人来回答。
通常,在设计级别,像Udemy这样的网站或拥有大量数据的网站会使用redis-db或elk以不同的时间间隔同步数据,因为在redis或elk上的读取操作比在SQL或任何RDBMS上的读取操作快得多。我建议你使用这些替代品。
但是,如果你想要一个更简单的解决方案,可以安排一个每小时运行一次的作业,并根据不同的过滤器计算所有数据,并将其存储在数据库中。在这种情况下,您在速度和准确性之间进行权衡。正如你提到的,你拥有的数据超过10k,没有用户会浏览每一页并计数,看看它是否与显示的数字匹配。