2015-10-16 9 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), сравнивая эфир с уникальным идентификатором или именем. и мне нужно сделать больше, но я начинаю чувствовать, что повторяю себя, и насколько я узнал 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(); 
} 

Есть способы немного убрать логику метода, но это так, как я ould начнется, поэтому вы не получите тонны различных методов, которые основаны на ваших фильтрах запросов.

+0

Я подумал над этим, проблема для меня - это времена, когда несколько условий должны быть истинными (так что, например, найти все с материальным именем и идентификатором в качестве примера) не будет ли это просто создать один огромный метод вместо этого с alot of if's? – Sumsar1812

+0

Запросы могут быть скомпонованы, поэтому вам просто нужно вывести выражение else в моем примере. Поэтому, если указан ID, вы добавляете предложение id where, и если имя материала указано, вы также * добавляете предложение where с именем. Если присутствует только один, вы добавляете только предложение where только для указанных. Запрос не выполняется до тех пор, пока не будет '.ToList()' it, поэтому вы можете добавить столько запросов '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)); 
}