Я изо всех сил пытаюсь найти правильные слова, чтобы подвести итог этой проблемы, поэтому любые замечания, которые я могу добавить, чтобы прояснить ее, будут оценены.
Основной сценарий таков: у меня есть базовая CMS (со страницами, пользователями и т. Д.). Страница - это объект данных LINQ, который отображается непосредственно в таблицу страниц.
Я добавил в класс Page метод GetUserPermissions. Этот метод принимает UserId и возвращает не-LINQ класс с именем PagePermissionSet, который описывает, что может делать пользователь. PagePermissionSet рассчитывается с помощью запроса LINQ.
Теперь я хочу получить список страниц, к которым у пользователя есть доступ. Идеальная реализация будет выглядеть следующим образом:
from page in mDataContext.Pages
where page.GetUserPermissions(userId).CanView
select page
Это завершается ошибкой, утверждая, что для GetUserPermissions не существует эквивалента SQL (что достаточно разумно) или после некоторого рефакторинга метода, что элемент CanView не может быть вызван для IQueryable.
Попытка два состояла в том, чтобы добавить метод к DataContext, который возвращает все разрешения для каждой страницы / пользователя в виде IQueryable:
IQueryable<PagePermissionSet> GetAllPagePermissions()
Затем я попытался присоединиться к этому набору результатов:
IQueryable<Page> GetAllPages(Guid? userId) {
var permissions = mDataContext.GetAllPagePermissions();
var pages =
from page in mDataContext.WikiPages
join permission in permissions on Page.FileName equals permission.PageName
where permission.CanView && permission.UserId == userId
select page;
return pages;
}
Это приводит к ошибке: «У члена 'WikiTome.Library.Model.PagePermissionSet.PageName' нет поддерживаемого перевода в SQL."
PagePermissionSet - это всего лишь оболочка, содержащая данные из предложения select в GetUserPermissions, и инициализируется следующим образом:
select new PagePermissionSet(pageName, userName, canView, canEdit, canRename)
С учетом всего этого ... Как я могу использовать запрос LINQ в Page.GetUserPermissions в другом запросе? Я определенно не хочу дублировать код, и я бы предпочел не переводить его в SQL для включения в качестве представления на данном этапе.