У меня есть следующая модель:
+--------+
| Folder |
+--------+
| 1
|
| *
+----------+ +---------+
| WorkItem |---------| Project |
+----------+ * 1 +---------+
Мне нужно получить список папок с текущим количеством WorkItems.
Если я указал проект, то я хочу толькоколичество рабочих элементов в каждой папке, связанных с указанным проектом.
Если проект не указан, он должен вернуть общее количество рабочих элементов.
У меня есть следующий код Linq to SQL:
public interface IWorkItemCriteria {
int? ProjectId { get; }
}
public static IQueryable<Folder> GetFoldersWithItemCounts(IWorkItemCriteria criteria) {
var results = from folder in dataContext.Folders
select new {
Folder = folder,
Count = folder.WorkItems.Count()
};
return(results);
}
Проблема в том, что я хочу отфильтровать подсчитываемые рабочие элементы.
Это работает:
var results = from folder in dataContext.Folders
select new {
Folder = folder,
Count = folder.WorkItems.Where(item => item.ProjectId == criteria.ProjectId).Count()
};
, но я не могу его получитьиспользовать любой вид динамического предиката / выражения.Синтаксис, который я пытаюсь использовать:
var results = from folder in dataContext.Folders
select new {
Folder = folder,
Count = folder.WorkItems.Where(filter).Count()
};
Я пробовал
Predicate<WorkItem> filter = (item => item.ProjectId == criteria.ProjectId);
и
Expression<Func<WorkItem, bool>> filter = (item => item.ProjectId == criteria.ProjectId)
, ни один из которых не скомпилируется - дает The type arguments for method 'System.Linq.Enumerable.Where<TSource> (System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,bool>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
Я пробовал
Func<WorkItem, bool> filter = (item => item.ProjectId == criteria.ProjectId);
, который строит, но затем завершается неудачно с 'Неподдерживаемая перегрузка, используемая для оператора запроса' Где '.'
Я собираюсьнеобходимо добавить дополнительные свойства в интерфейс IWorkItemCriteria, поэтому очень важно иметь возможность динамически создавать предикат, который может быть чисто переведен с помощью Linq в SQL.
Есть идеи?