2013-02-17 86 views
1

我有一個應用程序有一些上傳的文件。我試圖快速找到未刪除的孤立文件以刪除任何記錄以釋放磁盤空間。Linq查詢不匹配的項目

我已經創建了這個方法,但它在我的(窮人)linq上窒息。

任何人都可以看到我做錯了嗎?

public static IQueryable GetOrphanedFiles(int skip = 0, int take = 100) 
{ 
    using (var ctx = new CS3Entities()) 
    { 
     var files = (from f in ctx.Files 
        select new 
           { 
            FileID = f.ID 
           }); 


     var links = (from l in ctx.FileLinks 
        group l by l.FileID 
        into g 
        select new 
           { 
            FileID = g.Key 
           }); 

     var orhpans = links.Where(f => files.Contains(f.FileID)); <-- dies here 

     return orhpans.Skip(skip).Take(take); 
    } 
} 
+0

究竟你的意思是用死在這裏?一個例外? – bas 2013-02-17 12:51:55

+0

它不編譯:編譯器錯誤消息:CS1928:'System.Linq.IQueryable '不包含'包含'的定義和最佳擴展方法重載'System.Linq.ParallelEnumerable.Contains ( System.Linq.ParallelQuery ,TSource)'有一些無效參數 – 2013-02-17 12:53:55

+0

SQL分析器顯示什麼。甚至更有趣的f =>文件的調試值.Contains(f.FileID))這是否生成一個表達式樹太大,EF無法發送到SQLServer? – 2013-02-17 13:00:32

回答

3

變化如下:

var orhpans = links.Where(f => files.Select(x => x.FileID).Contains(f.FileID)); 
+1

@GordonCopestake您的原始查詢是否正確?對我來說,它看起來像是返回非孤兒fileIds? – Magnus 2013-02-17 12:59:45

+0

+1,是的,很難發佈糾正的linq聲明,當原始難以遵循。似乎@Magnus明白他想做什麼。 – 2013-02-17 13:03:29

+1

是的,老實說,Magnus解決了這個問題,但是我的邏輯是錯誤的。結束了這個,而不是:var orphans = files.Except(links);更容易! – 2013-02-17 13:07:27