在许多对象上下文中重用查询

时间:2012-08-25 14:46:49

标签: c# asp.net entity-framework linq-to-entities

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

我现在拥有的是许多复制/粘贴方法,几乎​​完全相同的查询和方法最后的不同行。

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

我想做这样的事情:

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条件。你能编译一个不是很简单的查询吗?

3 个答案:

答案 0 :(得分: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();         
}

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

答案 1 :(得分: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();
     }
 }

答案 2 :(得分: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();
    }
}