【发布时间】:2010-11-11 16:41:29
【问题描述】:
我有以下型号:
+--------+
| Folder |
+--------+
| 1
|
| *
+----------+ +---------+
| WorkItem |---------| Project |
+----------+ * 1 +---------+
我需要检索具有当前 WorkItems 计数的文件夹列表。
如果我指定了一个项目,那么我只需要每个文件夹中与指定项目关联的工作项的计数。
如果没有指定 Project,它应该返回 WorkItem 总数。
我有以下 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);
构建,但随后因“用于查询运算符 'Where' 的不支持重载而失败。”
我将需要向 IWorkItemCriteria 接口添加额外的属性,因此动态构造可以被 Linq 干净地转换为 SQL 的谓词的能力非常重要。
有什么想法吗?
【问题讨论】:
标签: linq linq-to-sql expression predicate