我有以下型號:如何將謂詞<T>傳遞給Linq to SQL中的Where()方法?
+--------+
| Folder |
+--------+
| 1
|
| *
+----------+ +---------+
| WorkItem |---------| Project |
+----------+ * 1 +---------+
我需要檢索文件夾列表與工作項的當前計數。
如果我指定了一個項目,那麼我只希望在每個文件夾都與指定的項目相關的工作項的數量。
如果未指定項目,則應返回總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謂詞的能力是非常重要的。
任何想法?
http://twitter.com/dylanbeattie/status/3051746305773568 :) – 2010-11-14 09:32:05