Вы можете сделать это так:
.Select(x =>
{
var result = new QuoteData
{
Login = x._user.Login,
Name = string.Format("{0} {1}", x._user.FirstName,
x._user.LastName),
Tel = x._surveyor.Mobile,
IsBasedInHeadOffice = x._user.IsBasedInHeadOffice
};
if(!result.IsBasedInHeadOffice)
result.Address = GetMeAddress();
return result;
});
UPDATE:
Используя LINQ2SQL или EF, это должно быть намного проще из-за так называемых навигационных свойств. По сути, они устраняют необходимость ручных объединений в вашем коде C #, если ваша база данных правильно настроена с использованием внешних ключей.
Например, если ваша таблица USER_HISTORY
будет иметь ограничение внешнего ключа для столбца user_id
для таблицы USER
, ваш класс User
будет иметь свойство UserHistories
типа IEnumerable<UserHistory>
, которое содержит всех связанных пользователей история и класс UserHistory
будут иметь свойство User
. То же самое относится ко всем остальным ассоциациям: Пользователь <-> Компания и Компания <-> Офис
Используя это, ваш код можно легко переписать так:
public PartialViewResult GetUsers(string term)
{
var sf = _repo.Single<Company>(x => x.Type == x.IsActive &&
(x.Identifier.Contains(term) || x.Name.Contains(term)));
var users =
sf.Users
.SelectMany(x => x.UserHistories
.Select(y =>
new QuoteData
{
Login = x.Login,
Name = string.Format("{0} {1}",
x.FirstName,
x.LastName),
Tel = y.Mobile,
IsBasedInHeadOffice = x.IsBasedInHeadOffice
Address = x.IsBasedInHeadOffice ?
sf.Office.Address :
string.Empty
}));
return PartialView("QuoteUsersUC", _users);
}