发布后修改
这可能吗?
拥有预编译的查询表达式
即
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推荐使用非静态方法的静态字段
任何帮助将不胜感激
答案 0 :(得分:0)
除了一些语法怪异(在查询表达式中它是where
而不是Where
,我不知道为什么你有[Id]
)我认为应该没问题。不可否认,我对编译的查询没有多少经验,但绝对值得一试。毕竟,LINQ是可编组的。
你试过吗?如果您有任何问题,请将其编辑到问题中,以便我们尝试解决这些问题。
编辑:响应“当在同一个类中定义,但在外部定义时不起作用”时,听起来你仍然试图将其称为 同班。这是一个方法,像调用任何其他方法一样调用它 - 如果是静态方法,则使用类型名称,否则通过引用调用。