发表已编辑
这可能吗?
有一个预编译的查询表达式
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 建议使用非静态方法的静态字段
任何帮助,将不胜感激