Вот упомянутые выше методы:
public IList<tst> testUsers()
{
IList<tst> testUsers = _test.GetAll().ToList();
return test(test);
}
Вот упомянутые выше методы:
public IList<tst> testUsers()
{
IList<tst> testUsers = _test.GetAll().ToList();
return test(test);
}
Чтобы отображать пользователей с местоположением, мне кажется, вам нужен один класс, называемый AdsnapshotUsers
public class AdsnapshotUsers
{
// three fields UserId, UserLogonName, Location
}
Теперь создайте один метод, который возвращает IList<AdsnapshotUsers>
public IList<AdsnapshotUsers> GetAdsnapshotUsers()
{
List<User> Users = GetAcitveUsers().ToList();
List<ADSnapshot> adSnapshotUsers = _adSnapshotRepository.GetAll().ToList();
return (from u in Users
join ad in adSnapshotUsers on u.UserLogonName equals ad.UserLogonName
select new AdsnapshotUsers {
UserId= u.UserId, UserLogonName = u.UserLogonName, Location = ad.Location
}
).ToList<AdsnapshotUsers>();
}
Left Outer Join, чтобы отображать все значения из таблицы пользователя, но если в таблице объявлений нет значения userlogonname (значение местоположения пустое)
(from u in Users
join ad in adSnapshotUsers on u.UserLogonName equals ad.UserLogonName into aduserselect
from ad1 in aduserselect.DefaultIfEmpty()
select new AdsnapshotUsers {
UserId= u.UserId, UserLogonName = u.UserLogonName, Location = ad1.Location
}
).ToList<AdsnapshotUsers>();
Здесь все записи из таблицы пользователя будут выбраны и для местоположения, если существует имя пользователя, тогда значение имени местоположения, установленное с табличным значением ADSnapshot, иначе не существует, а затем задано пустое значение по умолчанию.
Самый простой способ объединения двух IEnumerables в LINQ - с Join():
var joined = from u in GetActiveUsers()
join ad in _adSnapshotRepository.GetAll()
on u.UserLogonName equals ad.UserLogonName
select new { User = u, Location = ad.Location }
Конечно, присоединенный теперь IEnumerable анонимного типа. Если вы отображаете эту информацию в виде сетки или что-то, что требует плоского объекта, вы можете создать свой собственный класс со свойствами, которые вы хотите получить из каждой таблицы, и выбрать это вместо.
Две другие вещи, которые следует отметить:
(1) вы всегда вызываете ToList() раньше, чтобы конвертировать из IQueryable в IEnumerable. Отложив ToList(), пока вы не выполнили все ваши присоединения и фильтрации, вы можете получить большую часть своего запроса в SQL (а не в памяти).
(2) вместо того, чтобы присоединяться, часто предпочтительнее настраивать свойства ассоциации на своих объектах и использовать их:
IQueryable<User> users = ...
var combinedInfo = users.Select(u => new { User = u, Location = u.ADSnapshot.Location })
.ToList();
Если у вас есть отношения (1:1) между этими двумя таблицами, вы можете легко получить записи, используя только один запрос. и даже записи нет во второй таблице.
Я использую определение определенного класса для хранения данных.
_userRepository.GetAll().Select(u=>new AdsnapshotUsers {
UserId= u.UserId,
UserLogonName = u.UserLogonName,
Location = u.ADSnapshot.Location
}).ToList();