Linq Query Expression повторное использование - PullRequest
0 голосов
/ 28 ноября 2009

Сообщение отредактировано

Возможно ли это?

иметь предварительно скомпилированное выражение запроса

т.е.

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.StackOverflowException» произошло в System.Data.Linq.dll "

Сущность Xyz основана на вершине, ее доступность определяется флагами других типов в основных таблицах.

Поскольку Xyz используется во многих местах, я предварительно скомпилировал запрос для повышения производительности, просто хотел централизовать этот аспект, чтобы сделать его более удобным для обслуживания.

Когда я прохожу через отладчик, статические методы завершаются без каких-либо ошибок, но терпят неудачу во время следующего шага, то есть объединения и оценки. так что я немного озадачен тем, как решить эту проблему?

Прошу прощения за опечатки и любые другие неверные выводы, так как мои знания w.r.t c # и Linq ограничены,

Ps: для sidenote Linq2Action рекомендует статическое поле нестатическим методом

Любая помощь будет оценена

1 Ответ

0 голосов
/ 28 ноября 2009

Кроме нескольких странностей синтаксиса (в выражении запроса это where вместо Where, и я не знаю, почему у вас есть [Id]) Я думаю, что должно быть Хорошо. По общему признанию у меня нет большого опыта с скомпилированными запросами, но это определенно стоит попробовать. В конце концов, LINQ разработан для того, чтобы его можно было компоновать.

Вы пробовали это? Если у вас есть какие-либо проблемы, отредактируйте их в вопросе, чтобы мы могли попытаться решить их.

РЕДАКТИРОВАТЬ: Отвечая на «это работает, когда определено в том же классе, но не когда определено во внешнем» это звучит так, как будто вы все еще пытаетесь вызвать его, как если бы он был в том же учебный класс. Это метод, вызывайте его так же, как и любой другой метод - с именем типа, если это статический метод, или с помощью ссылки в противном случае.

...