通过数据访问层从数据库中获取数据的聪明方法?
smart way to get data out of database through 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 或名称上比较以太币。我需要做更多,但我开始觉得我在重复自己,据我所知 DRY。那么有没有更聪明的方法来做到这一点?
如果方法扩散是您的问题,而您所做的只是更改 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));
}
使用查询参数的所有不同变体创建一个 class,例如
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();
}
有一些方法可以稍微清理方法的逻辑,但这就是我开始的方式,所以您最终不会得到大量基于查询过滤器的不同方法。
我有一个包含很多不同数据集的数据库。我想根据许多不同的参数轻松搜索不同的数据集,例如我目前有:
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。那么有没有更聪明的方法来做到这一点?
如果方法扩散是您的问题,而您所做的只是更改 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));
}
使用查询参数的所有不同变体创建一个 class,例如
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();
}
有一些方法可以稍微清理方法的逻辑,但这就是我开始的方式,所以您最终不会得到大量基于查询过滤器的不同方法。