Linq Join - Дубликаты - PullRequest
       22

Linq Join - Дубликаты

3 голосов
/ 22 октября 2009

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

1. Таблица пользователей (имя пользователя, имя)

2. Таблица изображений (ID, имя пользователя, IsPrimary)

Каждый пользователь может иметь от нуля до нескольких изображений.

Я пытаюсь написать запрос, который вернет всех пользователей (с изображениями или без) и один идентификатор изображения (изображения с IsPrimary = true).

Я написал этот запрос Linq:

var v = from u in Users
    join p in Photos on u.Username equals p.Username 
    select new
    {
     u.Username,
     p.ID
          };

Это работает, но возвращает дубликаты пользовательских строк. (если у пользователя более одной фотографии).

Я хочу получить по одной строке на пользователя. Это возможно?

Ответы [ 4 ]

4 голосов
/ 22 октября 2009

Это должно делать именно то, что вы хотите.

from u in Users
let p = Photos.Where(p => p.Username == u.Username).FirstOrDefault()
where p <> null
select new
{
    u.Username,
    p.ID
};

Тем не менее, стоит отметить, что вам может быть лучше написать SQL-код, оптимизированный вручную, и извлекать объекты, используя db.ExecuteQuery<User> или аналогичный.

2 голосов
/ 22 октября 2009

Вы можете использовать группировку:

from p in photos
group p by p.username into g
select new
    {
     Username = g.Key,
     PicId = g.First().Id
    };

Вместо First () вы можете выполнить другую фильтрацию ...

1 голос
/ 22 октября 2009

Вы должны поместить IsPrimary в состояние where. Кроме того, поскольку у пользователя может быть нулевое изображение, вам нужно присоединиться слева.

РЕДАКТИРОВАТЬ: exmaple следует, (может иметь опечатку)

from u in Users
join p in (from p1 in Pictures where p1.IsPrimary select p1) on u.Username equals p.Username into pp
from p in pp.DefaultIfEmpty()
select new
{
  u.UserName,
  PicturePath = p == null ? "DummyPath" : p.PicturePath
}

РЕДАКТИРОВАТЬ: Кстати, Джон Гитцен, кажется, не дает ответ, который вы спрашивали.

0 голосов
/ 22 октября 2009

var upic = from u in users
           join p in pictures on u.UserName equals p.UserName into g
           from o in g.DefaultIfEmpty()
          where o == null || o.IsPrimary == true
         select new { UserName = u.UserName, Id = ( o == null ? "(No picture)" : o.Id ) };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...