通过数据访问层从数据库中获取数据的智能方法?

时间:2015-10-16 15:02:23

标签: c# sql-server entity-framework data-access-layer

我有一个包含许多不同数据集的数据库。我希望根据许多不同的参数轻松搜索不同的数据集,例如我目前有:

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或名称上的ether。我需要做更多但是我开始觉得我重复自己,据我所知DRY。那么有更聪明的方法吗?

2 个答案:

答案 0 :(得分:2)

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

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();
}

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

答案 1 :(得分:1)

如果方法扩散是你的问题,并且你所做的只是改变where语句,你可以使用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));
 }