Во-первых, некоторые заметки из книги: LINQ Карманный Справочник по J. & Б. Albahari:
1. Используя дополнительный от переводит к SelectMany.
2. в Статья переводится в группуJoin, когда она появляется сразу после . Присоединяется к статье.
Оба превосходных решений выше, Mike и Paolo, используют второй, дополнительный из пункта в запросе потому, что переводит к SelectMany. С помощью SelectMany «последовательность последовательностей» (последовательность аудиопоследовательностей) преобразуется в единый набор . Затем, чтобы подсчитать аудиосигналы, эта единая выходная коллекция на втором этапе сгруппирована в зависимости от месяца. В обоих вышеизложенных решениях это делается, и он работает нормально, но также требует тщательной проверки нулей.
ИСПОЛЬЗУЕТ ЕСТЕСТВЕННУЮ ИЕРАРХИЯ. Более чистым альтернативным способом является использование GroupJoin вместо SelectMany. GroupJoin дает иерархический набор результатов, а не плоский результирующий набор SelectMany. Иерархический результирующий набор не требует группировки, конечно, поэтому мы исключаем второй шаг.
Лучше всего, используя иерархический результирующий набор GroupJoin, нам не нужно проверять наличие нулей.
Таким образом, мы достигаем еще один чистый левое внешнее соединение с помощью этого кода, и заимствования данных Паоло:
static void Main(string[] args)
{
var ListOfAudios = new List<Audio>() {
new Audio() { someProperty = "test", RecordedDate = new DateTime(2011, 01, 01) },
new Audio() { someProperty = "test", RecordedDate = new DateTime(2011, 01, 02) },
new Audio() { someProperty = "test", RecordedDate = new DateTime(2011, 02, 01) },
new Audio() { someProperty = "test", RecordedDate = new DateTime(2011, 02, 02) }
};
var ListOfMonths = new List<Month>() {
new Month() {number=1, someMonthProperty="testMonth"},
new Month() {number=2, someMonthProperty="testMonth"},
new Month() {number=3, someMonthProperty="testMonth"}
};
var q = from month in ListOfMonths
join audio in ListOfAudios on month.number equals audio.RecordedDate.Month
into hierarch
select new
{
MonthNum = month.number,
AudioCnt = hierarch.Count()
};
foreach (var m in q)
{
Console.WriteLine("{0} - {1}", m.MonthNum,m.AudioCnt);
}
Console.ReadLine();
}
Разве это не 'left' присоединиться? – Alex
извините, это запрос – Anil
выберите b.number, COUNT (*) AS [AudioCount] из аудиофайлов a править месяц месяцев b на DATEPART (месяц, a. [RecordedDate]) = b.number группа по номеру и хотите изменить в linq – Anil