我有以下方法可以传递一个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);
有帮助吗?

解决方案

如果您使用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; });

这可能看起来很复杂,但它隐藏了很多异步魔法,并且在某些情况下可以直接从按钮处理程序调用。与其说是三层系统,不过是节省了大量时间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top