2012-04-04 1 views
0

У меня есть запрос linq to sql, который производит дубликаты. я могу понять, как устранить эти дубликаты записей. Может быть, кто-то здесь может помочь. Идея состоит в том, чтобы получить сумму «общего» из таблицы 2, которая встречается для дат в таблице 1, которые больше, чем даты таблицы2, а также даты в таблице 2, которые больше, чем 2011-01-01. То, что я добился этого, но из-за дубликатов, я получаю ровно вдвое больше суммы. Ваша помощь очень ценитсяlinq to sql duplicates in query eith join

Таблица структуры:

table1: id, date 
table2: id, date, total 

Запрос

from t1 in table1 
        join t2 in table2 on t1.id equals t2.id into x 
        from y in x 
        where t1.id == "123" && t1.date > y.date && y.date > DateTime.Parse("2011-01-01") 
        group t1 by new { y.total} into g 

        select g.Sum(t1 => t1.total); 
+0

Возможно, у вас есть две строки в t2, соответствующие одной строке в t1. Join производит две строки, суммирует обе строки с дублирующимися значениями в полях t1. Вы должны заменить join где. –

+0

Я пытаюсь это, но не могу понять, как это правильно записать. Это то, что у меня есть до сих пор var query = from t1 в таблице где (от t2 в t2 где t1.id == "123" && t1 .id == t2.id && t1.date> t2.date && t2.date> DateTime.Parse ("2011-01-01") выберите t2.total) группа t1 по t1.id в g выберите g.Sum (t2 => t2.total); –

ответ

2

Вы должны разбить запрос на несколько этапов:

Выберите данные, которые вы хотите:

var data = 
from t1 in table1 
join t2 in table2 on t1.Id equals t2.Id 
where t1.Id == "123" && t1.Date > t2.Date && t2.Date > DateTime.Parse("2011-01-01") 
select new {t1.Id, t2.Date, t2.Total}; 

Зов отчетливую, чтобы избежать повторяющихся элементов:

var distinct = data.Distinct(); 

Получайте сумму:

return distinct.GroupBy(x => x.Date) 
       .Select(g => g.Sum(item => item.Total)); 
+0

Это указывало мне в правильном направлении. Благодарю. –

0

Если вы не группируя его с помощью Id/Key и суммируя его в общей сложности?

как в

group t1 by new { y.Id} into g 
+0

попробовал это, но в итоге получил еще две записи, дублированные –

+0

. Еще одна вещь, которую вы могли попробовать - это посмотреть на SQL, который производит, копирует и вставляет ее в вашу студию управления SQL Server и запускает ее в разделе, чтобы увидеть, где вещи удваиваются. context.Log = new DebuggerWriter(); –

+0

спасибо за полезный совет. –