【问题标题】:Linq Query Expression reuseLinq 查询表达式重用
【发布时间】:2009-11-28 13:06:41
【问题描述】:

帖子已编辑

这可能吗?

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

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 推荐使用非静态方法的静态字段

任何帮助将不胜感激

【问题讨论】:

  • 什么是完整的签名?提供有关如何将代码组织到单独的类和方法中的更多详细信息。

标签: linq expression reusability compiled


【解决方案1】:

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

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

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

【讨论】:

  • 抱歉打错了,当静态声明在同一个类中时它确实有效,但在外部时无效。有没有其他方法可以使查询更可重用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多