1

这个周末我正在使用任务并行化一段代码来运行仪表板页面所需的所有查询。

我现在拥有的是许多复制/粘贴方法,它们具有几乎完全相同的查询和方法末尾的不同行。

有没有办法针对一个对象上下文编写查询,然后将其分离并传递给一个方法?

我想做这样的事情:

using(DbContext db = new DbContext)
{
   var query = db.cars.where(x => x.make == "Ford");

   int handleCounts = getDoorHandleCounts(query);
}

public int getDoorHandleCounts(type? query)
{
     using(DbContext db = new DbContext())
     {
          return query.where(x => x.partType == "DoorHandle").Count();
     }
 }

有任何想法吗?

请记住,我的所有 count() 方法都是从 Task 数组启动的,因此它们将并行运行。我需要一个新的对象上下文来运行每个计数查询。

我做了一些谷歌搜索并考虑尝试使用预编译的查询并从不同的对象上下文中调用它,但我的实际查询有点复杂,分配了 if 块来确定 where 条件。你能编译一个不是很简单的查询吗?

4

3 回答 3

0

也许我误解了这个问题,但这不是你想要的吗?

using(DbContext db = new DbContext)
{
   var carsResult = db.cars.where(x => x.make == "Ford");

   int handleCounts = getDoorHandleCounts(carsResult);
}

public int getDoorHandleCounts(IEnumerable<Car> result)
{
     return result.where(x => x.partType == "DoorHandle").Count();         
}

编辑:没关系,我现在才看到你提到的 Task 数组。

于 2012-08-25T14:58:26.540 回答
0

改变

public int getDoorHandleCounts(type? query)

public int getDoorHandleCounts(IQueryable<cars> query)

并替换cars为查询将返回的对象。

编辑

我只建议传递您要过滤的值,如下所示:

{
   ...
   int handleCounts = getDoorHandleCounts("Ford");
}

public int getDoorHandleCounts(string Make)
{
     using(DbContext db = new DbContext())
     {
          return db.cars.where(x => x.make == Make && x.partType == "DoorHandle").Count();
     }
 }
于 2012-08-25T15:03:58.403 回答
0

您不能从上下文中分离和附加查询。但是,您可以重用第一个表达式:

Expression<Func<Car,bool>> InitialSelection()
{
    return x => x.make == "Ford";
}

public int GetDoorHandleCounts()
{
    using(DbContext db = new DbContext())
    {
        return db.Cars()
               .Where(InitialSelection())
               .Where(x => x.partType == "DoorHandle").Count();
    }
}

在你的任务中:

int handleCounts = getDoorHandleCounts();

这仅在初始查询“简单”时才有效,即不包含连接集上的连接和谓词,您应该在每种getX方法中一遍又一遍地重复这些连接和谓词。

作为替代方案,您可以初始化上下文并将其提供给返回查询的方法:

public IQueryable<Car> GetInitialQuery(DbContext db)
{
    return db.Cars().Join(....)
           .Where(x => x.make == "Ford")
           .Where(....);
}

public int GetDoorHandleCounts()
{
    using(DbContext db = new DbContext())
    {
        return GetInitialQuery(db)
               .Where(x => x.partType == "DoorHandle").Count();
    }
}
于 2012-08-26T08:21:05.320 回答