我有以下方法可以传递一个lambda表达式来过滤我的结果,然后是一个可以在结果列表中使用的回调方法。这只是我系统中的一个特定表,我将一遍又一遍地使用这个结构。我如何构建一个通用方法,比如DBget将Table作为参数(ADO.NET dataservice实体公平)并传入过滤器(lambda experssion)。
public void getServiceDevelopmentPlan(Expression<Func<tblServiceDevelopmentPlan, bool>> filter, Action<List<tblServiceDevelopmentPlan>> callback)
{
var query = from employerSector in sdContext.tblServiceDevelopmentPlan.Where(filter)
select employerSector;
var DSQuery = (DataServiceQuery<tblServiceDevelopmentPlan>)query;
DSQuery.BeginExecute(result =>
{
callback(DSQuery.EndExecute(result).ToList<tblServiceDevelopmentPlan>());
}, null);
}
我的第一个打击是:
public delegate Action<List<Table>> DBAccess<Table>(Expression<Func<Table, bool>> filter);
答案 0 :(得分:0)
如果您使用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(string entity,Expression&gt; filter,Action callback) {
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
重复单个和列表返回。
如果你想要一个datacontext,或者在某种混合工厂/单件中跟踪上下文数组,那么将它捆绑成一个单例,你就不在了。让构造函数获取一个上下文,或者如果提供了非上下文,那么使用它自己,你就离开了。
然后我在一条大线上使用它,但所有在一个地方:
GenericQuery.Instance.Create().makeQuery<tblAgencyBranches>("tblAgencyBranches", f => f.tblAgencies.agencyID == _agency.agencyID, res => { AgenciesBranch.ItemsSource = res; });
这可能看起来很复杂,但它隐藏了很多异步魔法,并且在某些情况下可以直接从按钮处理程序调用。与其说是三层系统,不过是节省了大量时间。