Linq查询表达式重用

时间:2009-11-28 13:06:42

标签: linq expression reusability compiled

发布后修改

这可能吗?

拥有预编译的查询表达式

private static Func<SmwrDataContext, int, IQueryable<Xyz>> _validXyzs = 
   CompiledQuery.Compile((Context context, int Id) => 
                                from xyz in _db.XYZs 
                                join abc in _db.ABCs on xyz.Id equals abc.Id  
                                where xyz.TypeId = id && xyz.Flag && abc.Flag  
                                select xyz);

我最初在同一个存储库中声明这是直接访问它,没有消耗它的问题。

public List<MyItem> GetItemsForValueRange(int xyzTypeId, double floor, double ceiling)
{
    return (from xyx from _validXyzs (_db, xyzTypeId)
            join num from _db.numbers xyz.ID equals num.lettersId
            where 
                 num.Value >= floor && num.Value <= ceiling
                 num.Flag
            select new {
                         Name = xyz.Name, 
                         Value = num.Value
                       }).ToList();
}

稍后将静态变量重构为另一个类,因为同一个查询由多个存储库组成,

声明后重构如下(_filteredXyzs)与使其可用于消费的方法位于同一类中。

Public static IQueryable<Xyz> GetValidXyzs(Context context, int xyzTypeId)
{
   return from _filteredXyzs(context, id);
}

在重构后将其作为[RepositoryName] .GetValidXyzs在任何特定查询上下文中使用,但最终得到以下内容 System.Data.Linq.dll中出现“System.StackOverflowException”

Xyz实体基于顶层,其可用性由主表中其他类型的标志确定。

在许多地方使用Xyz,我预先编译了查询以获得更好的性能,只是想集中这个方面以使其更易于维护。

当我逐步调试静态方法时,退出时没有任何错误,但在下一步中失败,即加入和评估。所以我对如何解决这个问题感到有点难过?

对不起打字错误&amp;根据我的知识w.r.t c#和Linq有限,

Ps:在旁注上Linq2Action推荐使用非静态方法的静态字段

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

除了一些语法怪异(在查询表达式中它是where而不是Where,我不知道为什么你有[Id])我认为应该没问题。不可否认,我对编译的查询没有多少经验,但绝对值得一试。毕竟,LINQ是可编组的。

你试过吗?如果您有任何问题,请将其编辑到问题中,以便我们尝试解决这些问题。

编辑:响应“当在同一个类中定义,但在外部定义时不起作用”时,听起来你仍然试图将其称为 同班。这是一个方法,像调用任何其他方法一样调用它 - 如果是静态方法,则使用类型名称,否则通过引用调用。