0

我有以下方法,我可以传入一个 lambda 表达式来过滤我的结果,然后是一个回调方法,它将在结果列表上工作。这只是我系统中的一个特定表,我将一遍又一遍地使用这个结构。我如何构建一个通用方法,比如 DBget,它将一个 Table 作为参数(公平的 ADO.NET 数据服务实体)并传入一个过滤器(一个 lambda 表达式)。

 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);
4

1 回答 1

0

如果您使用 Linq to 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> 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

并重复单个和列表返回。

如果您想要一个数据上下文,请将其捆绑到一个单例中,或者在某种混合工厂/单例中跟踪一组上下文,然后您就离开了。让构造函数获取上下文,或者如果未提供上下文,则使用它自己的上下文,然后您就离开了。

然后我在一条大线上使用它,但都在一个地方:

GenericQuery.Instance.Create().makeQuery<tblAgencyBranches>("tblAgencyBranches", f => f.tblAgencies.agencyID == _agency.agencyID, res => { AgenciesBranch.ItemsSource = res; });

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

于 2010-01-27T11:56:40.057 回答