2009-07-16 38 views
1

我有兩個表:LINQ到XML +左加入+組由=失敗

block: int id, [other columns...] 
blockInstance: int id, int blockId (references Block.Id), [other columns...] 

我的目標是生成塊對象的枚舉具有兩個屬性:(1)ID(該塊的ID )和(2)InstanceCount(塊的實例數)。目前,我的XML文件不包含塊實例(該表存在但有零行)。

這是我的(非工作)查詢:

var groupedBlocks = 
    from 
     b in _tableDictionary["block"].Elements() 
    join 
     bi in _tableDictionary["blockInstance"].Elements() 
     on b.Element(_ns + "id").Value equals bi.Element(_ns + "blockId").Value into j 
    from 
     lj in j.DefaultIfEmpty() 
    group 
     lj by b.Element(_ns + "id").Value into g 
    select new 
    { 
     Id = g.Key, 
     InstanceCount = g.Count(i => i.Element(_ns + "blockId") != null) 
    }; 

問題是與謂詞(lambda表達式)爲g.Count()。如果刪除謂詞並僅使用g.Count(),則查詢會生成適當數量的行,但每行的InstanceCount爲1,這是錯誤的(應爲零)。在那裏有謂詞,查詢返回零行,如果我試圖在調試器中查看ResultsView,它會說「Exception:object reference not set to a instance of a object」。

我最大的困惑是什麼「我」在我的lambda表達式。我知道這是一個XElement,但是當數據是連接的結果時(這裏是一個左外連接),這個XElement包含了什麼?

好吧,當我輸入此信息時,我還有一個想法,它實際上工作:-),但我不知道爲什麼:-(所以我仍然會問這個問題;-) 。

如果我改變了違規代碼...

InstanceCount = g.Count(i => i != null) 

...它的工作原理。但爲什麼?!再一次,什麼是傳遞到lamba表達式?爲什麼它是空的?

謝謝!

回答

2

在你的組數引用相當於LJ,這是從枚舉j.DefaultIfEmpty()返回

DefaultIfEmpty()在這種情況下將返回默認值的項目,在項目沒有從以前join..into聲明輸出匹配的類型。

在引用類型(的XElement是引用類型),默認值爲NULL,這就是爲什麼你得到一個空引用異常,爲什麼檢查空第一消除問題的情況下。

編輯:

,通過使用子查詢避免了分組的另一種方法:

 
var groupedBlocks = 
    from b in _tableDictionary["block"].Elements() 
    select new 
    { 
     Id = b.Element(_ns + "id").Value, 
     InstanceCount = (from bi in _tableDictionary["blockInstance"].Elements() 
         where bi.Element(_ns + "blockId").Value == 
           b.Element(_ns + "id").Value 
         select bi).Count() 
    }; 
+0

@Sam謝謝你,山姆。這幾乎爲我清除它。我仍然得不到的一件事是,如果lj僅包含空值,那麼我怎麼能夠通過b.Element(_ns +「id」)將lj分組。換句話說,如果編譯器使用的枚舉是{null,null,null ...},那麼編譯器如何知道哪個項屬於哪個鍵(Block Id)?這對我來說沒有任何意義。 – devuxer 2009-07-16 06:57:22

0

傳遞給Count lambda的參數與您正在分組的類型相同。那是因爲你在g的背景下調用了Count,這是一個IGrouping<string, XElement>。因此,iXElement

在你實際進行檢查分組XElement的第一個孩子,(訪問i.Element法)第一個查詢,這就是爲什麼它沒有工作。