2012-01-17 68 views
2

我想寫一個LINQ查詢來計算一個類型的出現次數。LINQ計數的發生

事情是這樣的:

var qry = from c in db.XBLRegionalContents 
    where c.PublishDate <= DateTime.Today 
    group c by c.ContentId into grouped 
    select new FeaturedViewModel { XBLRegionalContent = db.XBLRegionalContents.Find(grouped.Key), RegionCount = grouped.Count() }; 

但有些事情是不對的。我想顯示XBLRegionalContents對象的數量,它有多少區域在數據庫上。

有人可以幫助我嗎?

謝謝。

UPDATE

這裏是XBLRegionalContent

public class XBLRegionalContent 
{ 
    [Key, Column(Order = 0)] 
    public string ContentId { get; set; } 
    [ForeignKey("ContentId")] 
    public virtual XBLContent Content { get; set; } 

    [Key, Column(Order = 1)] 
    public string RegionId { get; set; } 
    [ForeignKey("RegionId")] 
    public virtual XBLRegion Region { get; set; } 

    public string Name { get; set; } 

    public string Description { get; set; } 
} 
+0

你得到什麼呢? – 2012-01-17 18:26:20

+0

每個區域內容都顯示爲count = 1。我試圖通過相同的ContentId對所有區域進行分組,並在顯示對象時統計它們。 – programad 2012-01-17 18:29:11

+0

如果你跳過'db.XBLRegionalContents.Find(grouped.Key)'並且只返回密鑰,你仍然得到相同的計數嗎? (你應該)在這種情況下,你應該驗證你的數據。 – Magnus 2012-01-17 18:44:05

回答

0

我做到了!

這是解決方案:

var qry = from c in db.XBLRegionalContents 
    where c.PublishDate <= DateTime.Today 
    group c by c.ContentId into grouped 
    select new FeaturedViewModel { 
     XBLRegionalContent = grouped.FirstOrDefault(x => x.ContentId == grouped.Key), 
     RegionCount = grouped.Count() 
    }; 

感謝大家的幫助!

0

的代碼,我覺得你的問題是與你的Find聲明。 Find()應帶有一個返回true或false的謂詞。你只是傳遞一個字符串,所以我想這只是循環你的集合中的每個項目。

我花了一些自由與您的示例代碼,並與LinqPad放在一起的一個小例子來演示使用查找。你應該得到一個2的計數爲「a」的內容ID,其他的計數爲1.

(Dump()方法特定於LinqPad - 它只是打印出一個對象或集合的所有屬性)

void Main() 
{ 
    var XBLRegionalContents = new List<XBLRegionalContent>(){ 
     new XBLRegionalContent { contentID = "a", ID = "aa" }, 
     new XBLRegionalContent { contentID = "b", ID = "bb" }, 
     new XBLRegionalContent { contentID = "a", ID = "cc" }, 
     new XBLRegionalContent { contentID = "d", ID = "dd" } 
    }; 

    XBLRegionalContents.Dump(); 

    var qry = from c in XBLRegionalContents 
     group c by c.contentID into grouped 
     select new { xbl = XBLRegionalContents.Find(x => x.contentID == grouped.Key), regionCount = grouped.Count() }; 

    qry.Dump(); 
} 

// Define other methods and classes here 
public class XBLRegionalContent{ 
    public string contentID {get;set;} 
    public string ID {get;set;} 
} 

希望這會有所幫助。讓我知道是否還有其他問題。祝你好運!

+0

不起作用,因爲Find()接收params object [],而不是lambda表達式。 Anywah,謝謝你的幫助。 – programad 2012-01-17 18:50:11

+0

對不起,它沒有幫助。我沒有注意到你正在使用EF。 XBLRegionalContent的主要關鍵是什麼? – 2012-01-17 19:00:16

+0

它是「ContentId」和「RegionId」的多重PK。 – programad 2012-01-17 19:01:35