Если вы используете Linq для Ado.NET Dataservices или WCF Dataservices, ваша модель создаст много типизированных. Вообще, хотя вы будете выбирать и фильтровать. Вам нужно следующее, тогда все ваши методы просто конфетка поверх этого:
Тип запроса 1 - один фильтр, возвращает список:
public void makeQuery<T>(string entity, Expression<Func<T, bool>> filter, Action<List<T>> callback)
{
IQueryable<T> query = plussContext.CreateQuery<T>(entity).Where(filter);
var DSQuery = (DataServiceQuery<T>)query;
DSQuery.BeginExecute(result =>
{
callback(DSQuery.EndExecute(result).ToList<T>());
}, null);
}
Тип запроса 2 - один фильтр, возвращает одну сущность:
public void makeQuery (строковая сущность, выражение> фильтр, обратный вызов действия)
{
IQueryable<T> query = plussContext.CreateQuery<T>(entity).Where(filter);
var DSQuery = (DataServiceQuery<T>)query;
DSQuery.BeginExecute(result =>
{
callback(DSQuery.EndExecute(result).First<T>());
}, null);
}
Вам нужно перегрузить их и заменить фильтр на простой массив фильтров
Expression<Func<T, bool>>[] filter
И повторите для сингла и списка возвратов.
Объедините это в синглтон, если вам нужен один текстовый текстовый код, или следите за массивом контекстов в какой-то гибридной фабрике / синглтоне, и вас нет. Позвольте конструктору взять контекст или, если он не указан, используйте его, и вас нет.
Затем я использую это на большой линии, но все в одном месте:
GenericQuery.Instance.Create().makeQuery<tblAgencyBranches>("tblAgencyBranches", f => f.tblAgencies.agencyID == _agency.agencyID, res => { AgenciesBranch.ItemsSource = res; });
Это может показаться сложным, но оно скрывает много асинхронной магии, и в некоторых случаях может вызываться прямо из обработчиков кнопок. Не столько трехуровневая система, сколько экономия времени.