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

我有一个ASP.NET MVC网站.在我的后端,我有一个名为People的表,其中包含以下列:

> ID
>姓名
>年龄
>位置
> ……(其他一些cols)

我有一个通用的网页,使用模型绑定来查询这些数据.这是我的控制器动作:

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个字段,我无法找到将此查询“过滤信息”存储到我的数据库中的最优雅方式.

我能想到的选择是:

>有一个完整的表复制(带有一些额外的cols),但称之为PeopleFilterQueries并在每个记录中填充一个FilterName并将过滤器的值放在每个字段中(Name等)
>存储一个只有FilterName的表和一个字符串,我存储实际的查询字符串Name = Bill& Location = NewYork.这样,如果过滤器更改或增长,我将不必继续添加新列.

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

解决方法

如果目的是保存最近使用的过滤器列表,我会在模型绑定发生后将完整的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,. . .);

          // 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,为简洁起见,没有错误处理.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....