2015-10-16 83 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)); 
}