【问题标题】:Splitting a large dataset into smaller groups将大型数据集拆分为较小的组
【发布时间】:2017-02-14 23:36:34
【问题描述】:

我正在尝试构建复选框和单选按钮的侧边栏搜索导航过滤器。我正在从数据库中获取值。类似于以下内容,但共有 12 个过滤器类别:

Color
    [] red
    [] green
    [] blue 
Size
    [] small
    [] medium
    [] large
Shape
    [] square
    [] circle
    [] triangle

使用下面的代码对我有用。但是为每个子类别进行数据库调用似乎确实效率低下:

public ActionResult Index ()
{
    SearchBarViewModel model = new SearchBarViewModel();
    model.Color = GetValuesFromDb();
    model.Size = GetValuesFromDb();
    model.Shape = GetValuesFromDb();
    return View(model)
}

我猜有一种更有效的方法来做到这一点,即进行单个数据库查询,返回一个包含所有类别值的大型数据集,然后将它们拆分为使用 linq 的组?我只是不确定如何做到这一点?

数据库架构*

SearchKey           SearchValue
---------           -----------------
Id  Name            Id  KeyId   Value
---------           -----------------
1   Color           1   1       Red
2   Size            2   1       Green
3   Shape           3   1       Blue
                    4   2       Small
                    5   2       Medium
                    6   2       Large

Sql 查询

SELECT sv.Id, sv.Value
FROM SearchKey sk
JOIN SearchValue sv ON sv.KeyId = sk.Id
WHERE sk.Name = @ValuePassedToSP

【问题讨论】:

  • 可以使用 GroupBy msdn.microsoft.com/en-us/library/…,但所有可能的解决方案在很大程度上取决于您查询的表的外观
  • 如果ColorShapeSize 都在同一个数据库表中......那么你可以只调用数据库一次......将所有记录存储到一个列表中......然后只需根据您想要的记录类型过滤该列表。
  • 你能发布GetValuesFromDb()方法吗?
  • 这个答案可以帮到你stackoverflow.com/a/15124989/335905

标签: c# .net linq


【解决方案1】:

在您的开发过程中,关注 db 调用的性能可能会也可能不会太早。如果菜单值不经常更改或在不同的上下文中更改,则将菜单结构像您一样存储在数据库中会更有意义。如果菜单值不经常更改,最好将它们存储在程序代码或设置文件中,该文件仅在您的应用首次加载时加载,或者在之后按需加载。

我认为您正在寻找的上下文中的 linq 可能是这样的,其中“GetALLSearchValuesFromDb()”方法返回一个由 SQL 语句生成的 IEnumerable,就像您已经拥有的一样,只是没有 WHERE 子句:

public ActionResult Index ()
{
    SearchBarViewModel model = new SearchBarViewModel();
    var searchvalues = GetALLSearchValuesFromDb();
    model.Color = searchvalues.Where(sv => sv.Name == "Color");
    model.Size = searchvalues.Where(sv => sv.Name == "Size");
    model.Shape = searchvalues.Where(sv => sv.Name == "Shape");
    return View(model)
}

【讨论】:

  • 是的,这就像我正在考虑的解决方案,我只是在看到它之前无法想象它。感谢您的有用帖子!
猜你喜欢
  • 2021-03-28
  • 2014-02-21
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2022-07-22
  • 1970-01-01
相关资源
最近更新 更多