通过数据访问层从数据库中获取数据的聪明方法

本文关键字:数据 获取 方法 数据库 访问 | 更新日期: 2023-09-27 18:17:58

我有一个数据库,有很多不同的数据集。我想让它很容易搜索不同的数据集取决于许多不同的参数,例如我目前有:

public List<Dataset> GetAllDatasetsByMethod(Method method)

使用这个查询:

var datasets = from b in db.Method where b.Id == method.Id select b.Dataset;

然后我有另一个方法,像这样:

public List<Dataset> GetAllDatasetsByTargetMaterial(TargetMaterial material)

和这样的查询:

var datasets = from b in db.Dataset
                where b.TargetMaterial.Name.ToLower() == material.Name.ToLower()
                select b;

我得到了很多这样的方法(如10-15)比较一个唯一的id或名称。我需要做更多,但我开始觉得我在重复自己,就我已经学会了DRY。那么有没有更聪明的方法呢?

通过数据访问层从数据库中获取数据的聪明方法

创建一个包含所有不同查询参数变体的类,如

public class MyTypeQueryParameters
{
    public int? Id {get; set;}
    public string MaterialName {get; set;}
}

你可以把你的数据访问层设计成一个内部API,并有一个方法:

public List<DataSet> GetDataSets(MyTypeQueryParameters parameters) {
    var query = db.DataSet.AsQueryable;
    if (parameters.Id != null) 
    {
        query = query.Where(x => x.Id == parameters.Id.Value);
    }
    if (!string.IsNullOrWhitespace(MaterialName))
    {
        query = query.Where(x => x.TargetMaterial.Name == parameters.MaterialName);
    }
    return query.ToList();
}

有一些方法可以稍微清理一下方法的逻辑,但这就是我开始的方式,所以你不会以大量不同的方法告终,这些方法都是基于你的查询过滤器。

如果方法扩散是你的问题,而你所做的只是改变where语句,你可以使用一个Func作为参数,并提供你想要的逻辑作为一个Func。

,

 public IEnumerable<MyType> GetAllDataSetBy<MyType>(Func<MyType,bool> func) {
      return db.DataSet.Where(b=>func(b));
 }
 public MyType GetSingle<MyType>(Func<MyType,bool> func) {
      return db.DataSet.Single(b=>func(b));
 }