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