gpt4 book ai didi

asp.net-mvc - 将用户过滤的查询参数存储在数据库表中的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 13:34:10 25 4
gpt4 key购买 nike

我有一个 ASP.NET MVC 网站。在我的后端,我有一个名为 People 的表具有以下列:

  • 编号
  • 姓名
  • 年龄
  • 位置
  • ...(其他一些列)

  • 我有一个通用网页,它使用模型绑定(bind)来查询这些数据。这是我的 Controller 操作:
    public ActionResult GetData(FilterParams filterParams)
    {
    return View(_dataAccess.Retrieve(filterParams.Name, filterParams.Age, filterParams.location, . . .)
    }

    它映射到这样的东西:
     http://www.mysite.com/MyController/GetData?Name=Bill .. . 

    dataAccess 层只是检查每个参数以查看其是否填充以添加到 db where 子句。这很好用。

    我现在希望能够存储用户过滤后的查询,并且我正在尝试找出存储特定过滤器的最佳方法。由于某些过滤器在 queryString 中只有一个参数,而其他过滤器中有 10 多个字段,因此我无法找出将此查询“过滤器信息”存储到数据库中的最优雅方法。

    我能想到的选项是:
  • 完整复制表(带有一些额外的列),但将其称为 PeopleFilterQueries 并在每条记录中填充一个 FilterName 并将过滤器的值放入每个字段(名称等)
  • 存储一个仅包含 FilterName 和一个字符串的表,其中存储了实际的查询字符串 Name=Bill&Location=NewYork。这样,如果过滤器更改或增长,我就不必继续添加新列。

  • 这种情况的最佳做法是什么?

    最佳答案

    如果目的是保存最近使用的过滤器列表,我会在模型绑定(bind)发生后将完整的 FilterParams 对象序列化为 XML 字段/列。通过将其保存到 XML 字段中,您还可以灵活地使用 XQuery 和 DML,以便日后需要更注重性能的信息查询。

        public ActionResult GetData(FilterParams filterParams)
    {
    // Peform action to get the information from your data access layer here
    var someData = _dataAccess.Retrieve(filterParams.Name, filterParams.Age, filterParams.location, . . .);

    // Save the search that was used to retrieve later here
    _dataAccess.SaveFilter(filterParams);
    return View(someData);
    }

    然后在您的 DataAccess 类中,您将需要两种方法,一种用于保存,一种用于检索过滤器:
    public void SaveFilter(FilterParams filterParams){
    var ser = new System.Xml.Serialization.XmlSerializer(typeof(FilterParams));
    using (var stream = new StringWriter())
    {
    // serialise to the stream
    ser.Serialize(stream, filterParams);
    }
    //Add new database entry here, with a serialised string created from the FilterParams obj
    someDBClass.SaveFilterToDB(stream.ToString());
    }

    然后,当您想检索已保存的过滤器时,可能是通过 Id:
    public FilterParams GetFilter(int filterId){

    //Get the XML blob from your database as a string
    string filter = someDBClass.GetFilterAsString(filterId);

    var ser = new System.Xml.Serialization.XmlSerializer(typeof(FilterParams));

    using (var sr = new StringReader(filterParams))
    {
    return (FilterParams)ser.Deserialize(sr);
    }
    }

    请记住,您的 FilterParams 类必须有一个默认(即无参数)构造函数,并且您可以使用 [XmlIgnore]如果您愿意,可以防止属性被序列化到数据库中。
    public class FilterParams{
    public string Name {get;set;}
    public string Age {get;set;}

    [XmlIgnore]
    public string PropertyYouDontWantToSerialise {get;set;}
    }

    注意: SaveFilter 返回 Void 并且为简洁起见没有错误处理。

    关于asp.net-mvc - 将用户过滤的查询参数存储在数据库表中的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8686144/

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