Лямбда-утверждение к результатам проекта на основе - PullRequest
0 голосов
/ 16 августа 2011

У меня есть пользователь, который является частью компании, эта компания может иметь несколько офисов, так что пользователь может быть частью головного / главного офиса или частью другого офиса, я проецирую из выражения lamdba, но не могу понятькак это сделать: если пользователь не является головным офисом, выкинуть адрес офисатаблица, связанная с этим пользователем), вот что я сделал до сих пор:

    [HttpPost]
    [AjaxOnly]
    public PartialViewResult GetUsers(string term)
    {

        var _sf = _repo.Single<Company>(x => x.Type == x.IsActive &&
            (x.Identifier.Contains(term) || x.Name.Contains(term)));

        //get company with addresses...
        var users = _repo.All<User>().Where(x => x.CompanyID == _sf.CompanyID);
        var offices = _repo.All<Office>().Where(x => x.CompanyID == _sf.CompanyID);

        var _users = _repo.All<UserHistory>()
            .Join(users, x => x.UserID, y => y.UserID,
            (s, u) => new
            {
                _s = s,
                _user = u
            }).Select(x => new QuoteData
            {
                Login = x._user.Login,
                Name = string.Format("{0} {1}", x._user.FirstName, x._user.LastName),
                Tel = x._s.Mobile,
//let me know where user is based, if head office get me the address too...
                IsBasedInHeadOffice = x._user.IsBasedInHeadOffice

//here: if !IsBasedInHeadOffice => GetMeAddress
            });

        return PartialView("QuoteUsersUC", _users);
    }

public class QuoteData
{
    public string Login { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string Tel { get; set; }
    public bool IsBasedInHeadOffice { get; set; }
}

Мог бы я написать это еще лучше / проще?

1 Ответ

1 голос
/ 16 августа 2011

Вы можете сделать это так:

.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);
}
...