0

发表已编辑

这可能吗?

有一个预编译的查询表达式

IE

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 在许多地方使用,我预编译了查询以获得更好的性能,只是想集中这方面以使其更易于维护。

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

对于拼写错误和任何其他不正确的推论,我很抱歉,因为我对 c# 和 Linq 的了解有限,

Ps:在旁注中 Linq2Action 建议使用非静态方法的静态字段

任何帮助,将不胜感激

4

1 回答 1

0

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

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

编辑:回应“这在同一个类中定义时有效,但在外部定义时无效”听起来你仍在尝试调用它,就好像它同一个类中一样。它是一个方法,像调用任何其他方法一样调用它 - 如果它是静态方法,则使用类型名称,否则通过引用。

于 2009-11-28T13:46:23.610 回答