.NET Linq Join - PullRequest
       16

.NET Linq Join

4 голосов
/ 06 марта 2009

У меня есть 2 таблицы в SQL.

Table 1 
Step Id
Step Name

Table 2
Profile Id
Step Id
Completed

Я хотел бы вернуть следующие результаты, даже если в таблице 2 нет совпадений:

Results
Table1.Step Id
Table1.Step Name
Table2.Profile Id
Table2.Completed 

Я делаю это в SQL следующим образом:

select * from [Table 1] t1
left join [Table 2] t2
on t1.Step Id = t2.Step Id

Это дает ожидаемые результаты.

Когда я перевожу это на linq:

public static List<UserCompletion> GetStepCompletion(string category, string profileid) { 

List<Step> step = GetSteps(category);
List<UserStep> userStep = GetUserSteps(category, profileId);    

var q = from s in step
         join us in userStep
         on s.Id equals us.StepId
         select new UserCompletion
         {
           StepId = s.Id,
           Headline = s.StepName,
           ProfileId = us.ProfileId
           Completed= us.Completed
          };

     return q.ToList();

}

Это работает, но как JOIN, а не левое соединение. Я получаю только совпадающие результаты.

Кроме того, UserCompletion - это объект, который я возвращаю из этого метода.

Я несколько дней бился об этом ... любая помощь была бы признательна.

Ответы [ 3 ]

5 голосов
/ 06 марта 2009

Вы также можете попробовать это (при условии, что мы. Завершено - логическое значение):

var q = from s in step
         let us = (from i in userStep where s.Id = i.StepId).SingleOrDefault()
         select new UserCompletion
         {
           StepId = s.Id,
           Headline = s.StepName,
           ProfileId = us.ProfileId
           Completed = us == null ? false : us.Completed
          };

Это не превратится в объединение в SQL, но вложенный оператор select будет выглядеть примерно так:

select 
    StepId, Headline, ProfileId,
    isnull((select top(1) Completed from userStep where StepId = Id), 0) as Completed
from step
3 голосов
/ 06 марта 2009

Попробуйте что-то вроде следующего:

var q = from s in step
        join us in userStep 
        on s.Id equals us.StepId into tmpjoin
        from x in tmpjoin.DefaultIfEmpty()
        select new UserCompletion { ... }
0 голосов
/ 06 марта 2009

Нашли.

Похоже, мне нужно добавить оценку для элемента, который "может" быть нулевым.

Я добавил следующее к своему выбору

Completed = (x == null) ? String.Empty : x.Completed 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...