2015-10-16 66 views
1

我有一个数据库有很多不同的数据集。我想可以很容易地搜索不同的数据集,这取决于许多不同的参数,比如我现在有:智能方式通过数据访问层从数据库中获取数据?

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。那么有没有更聪明的方法来做到这一点?

回答

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

有一些方法来清理方法的逻辑一点,但这就是我如何w首先应该开始,所以最终不会有大量基于查询过滤器的不同方法。

+0

我已经考虑过这样做,对于我来说问题是有时候多个条件必须是真实的(所以在同一时间找到所有材料名和id的例子)是不是会创建一个巨大的方法而不是很多if? – Sumsar1812

+0

查询是可组合的,因此您只需在我的示例中删除else语句。因此,如果指定了ID,则添加id where子句,并且如果指定了材料名称,则还*将where子句添加名称。如果只有一个存在,则只为指定的唯一的那个添加where子句。直到你'.ToList()'它才会执行查询,所以你可以添加尽可能多的'query = query.Where(x => whatever)'子句。 – KallDrexx

+0

你可以尝试编辑你的例子来证明这一点吗? – Sumsar1812

1

如果方法泛滥是您的问题,并且您所做的只是更改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)); 
}