2012-01-17 3 views
2

Я пытаюсь написать запрос LINQ для подсчета количества ошибок типа.LINQ Count ocurrences

Что-то вроде этого:

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 с подсчетом количества областей, которые он имеет на db.

Может кто-нибудь помочь мне в этом?

Спасибо.

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

Что вы получаете вместо этого? –

+0

Каждый региональный контент отображается с count = 1. Я пытаюсь сгруппировать все регионы одним и тем же ContentId и подсчитать их, показывая сам объект. – programad

+0

Если вы пропустите 'db.XBLRegionalContents.Find (grouped.Key)' и вернете только ключ, вы все равно получите тот же счет? (вы должны) В этом случае вы должны проверить свои данные. – Magnus

ответ

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, чтобы продемонстрировать использование Find. Вы должны получить идентификатор контента «a» со счетом 2, а все остальное имеет счет 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 [], а не лямбда-выражение. Anywah, спасибо за вашу помощь. – programad

+0

Жаль, что это не помогло. Я не заметил, что вы используете EF. Каков ваш основной ключ для XBLRegionalContent? –

+0

Это многократный ПК «ContentId» и «RegionId». – programad