У меня есть отношения между Users
и UsersProjects
. UserProjects.UserId
ссылки на Users.UserId
LINQ Union vs SQL Union
Я хочу, чтобы найти пользователя, который находится в UserProjects
и UserProject
имеет UsreProjects.ProjectId == 4
. Затем присоедините остальных пользователей к этой таблице.
На самом деле я хочу изменить некоторые свойства пользователя, который UserProject = 4
.
В MSSQL, просто чтобы проверить меня ниже запроса
Select U.UserId
from Users U
Join UserProjects UP
On U.UserId = up.UserId
Where up.ProjectId = 4
Union
Select U.UserId From Users U
Я не изменять любые свойства. Во всяком случае, в результате он показывает мне всех пользователей, как и должно быть.
Но теперь использование того же запроса с изменением свойств приводит к большему количеству пользователей, чем я.
var usrs = ((from users in context.Users
join userProj in context.UserProjects
on users.UserId equals userProj.UserId
where userProj.ProjectId == projectId
select new ProjectUsersDTO
{
UserName = users.Name,
Rate = users.RatePerHour,
UserId = users.UserId,
alreadyInProject = true
})
.Union(from users in context.Users
select new ProjectUsersDTO
{
UserName = users.Name,
Rate = users.RatePerHour,
UserId = users.UserId,
alreadyInProject = false
}))
.ToList();
return usrs;
Как это происходит, когда UNION не допускает дубликатов?
Спасибо за внимание!
Вашего LINQ союз должен привести к уникальным объектам до тех пор, как объекты сопоставимы и равны. Ваши объекты являются ProjectUsersDTO. Я думаю, вам нужно будет реализовать интерфейс IEquatable для этого объекта, чтобы профсоюз работал так, как вы планируете. Кроме того, ваши значения немного отличаются, поскольку свойства «ужеInProject» [sic] не идентичны. Если ваша реализация IEquatable игнорирует это свойство, это не имеет значения. –
Вы используете IEnumerable.Union, поскольку вы проектируете DTO перед объединением. Если вы хотите, чтобы отчет выполнялся с помощью базы данных, вам нужно отложить проецирование на DTO до момента объединения. Поэтому создайте анонимный тип в обоих запросах, затем в объединении, затем добавьте вызов AsEnumerable(), затем выполните проект в DTO, затем выполните ToList(). – Maarten
@Maarten Я как раз собирался добавить это. –