Distinct LINQ Statement - Выберите группу, в которой сущность не существует - PullRequest
1 голос
/ 08 января 2011

В настоящее время у меня есть оператор LINQ, который возвращает IQueryable для отображения в Telerik RadGrid. Этот оператор настроен на получение записей, соответствующих введенному периоду, а также для столбца «Премиум» установлено значение true. Затем он четко выбирает EmployeeID и ProjectID, используя свойство GroupBy.

Эти столбцы затем отображаются в RadGrid вместе со столбцом «PremiumCode». В настоящее время мое утверждение работает для отображения ВСЕХ записей, которые соответствуют верхним учетным данным (Имя сотрудника, Проект, Премиум-код), но моя конечная цель - извлечь только те записи, которые DONT уже имеют " Премиум-код », присвоенный Проекту для данного сотрудника .

public static IQueryable GetEmptyPremiums(string Period)
    {
        DataContext Data = new DataContext();
        var PR = (from c in Data.System_Times
                  where c.Period == Period && c.Premium == true
                  orderby c.System_Employee.LName
                  select c).GroupBy(s => s.EmployeeID & s.ProjectID).Select(x => x.FirstOrDefault());

        return PR;
    }

В настоящее время он отображается правильно, но отображаются все записи, а не только те, которые требуют PremiumCode.

alt text

Есть ли способ переделать мою инструкцию LINQ, чтобы включить только те записи, которые требуют PremiumCode?

EDIT:
Джей, Я пытался изменить ваше решение в соответствии со своими потребностями, но, к сожалению, безуспешно. Записи в таблице Премиум не добавляются до тех пор, пока не будет определен Премиум-код, поэтому никогда не будет нулевого «Премиум-кода».

Чтобы описать мою конечную цель немного яснее: я хочу показать информацию в виде сетки, как на картинке выше. Показанные записи будут отдельными записями времени, в которых значение bool «Premium» помечено как истинное, но не имеет записи PremiumCode в таблице «Premium».

Если проверенная запись имеет соответствующую запись в таблице Премиум (EmployeeID и ProjectID , совпадающую ), то она уже имеет набор Премиум-кода и не должна отображаться в сетки.

Если отмеченная запись не имеет соответствующей записи в таблице Premium (EmployeeID и ProjectID не соответствует ), тогда для требуется PremiumCode и ее необходимо отобразить в таблице.

Я полагаю, что этого можно достичь с помощью ".Any ()", но у меня возникают проблемы с выравниванием моего синтаксиса и логики для правильного отображения этой таблицы.

Ответы [ 2 ]

2 голосов
/ 08 января 2011

Как насчет:

 DataContext Data = new DataContext();
 var projectsWithoutPremium = Data.Premiums.Where(p => p.PremiumCode == null)
                             .Select(p => p.ProjectId);
 var PR = (from c in Data.System_Times
          where c.Period == Period && c.Premium == true
                && projectsWithoutPremium.Contains(c.ProjectId)
          orderby c.System_Employee.LName
          select c).GroupBy(s => s.EmployeeID & s.ProjectID).Select(x => x.FirstOrDefault());

 return PR;

обновление в ответ на редактирование вопроса

DataContext Data = new DataContext();
var PR = (from c in Data.System_Times
             where c.Period == Period && c.Premium == true
                 && !Data.Premiums.Any(p => p.ProjectID == c.ProjectID && p.EmployeeID == c.ProjectID) 
             orderby c.System_Employee.LName select c)
             .GroupBy(s => s.EmployeeID & s.ProjectID)
             .Select(x => x.FirstOrDefault());

return PR;
0 голосов
/ 08 января 2011

Если премиум-код является строкой, вы можете попробовать добавить что-то вроде .Where(x => string.isNullOrEmpty(x.PremiumCode)) перед предложением GroupBy.

...