将大型数据集拆分为较小的组

时间:2017-02-14 14:32:34

标签: c# .net linq

我正在尝试构建复选框和单选按钮的侧边栏搜索导航过滤器。我从数据库中获取值。类似于以下内容,但总共有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 Query

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

1 个答案:

答案 0 :(得分: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)
}