基于if的Lambda语句项目结果

时间:2011-08-16 09:18:04

标签: linq linq-to-sql lambda c#-3.0

我有一个公司的用户,该公司可以有多个办公室,所以用户可以成为总部/主办公室的一部分或另一个办公室的一部分,我从lamdba表达突出但我无法弄清楚怎么办:如果用户不是办公室,那就扔掉了办公地址。

下面的代码显示了用户,加入了userhistory(2表连接 - 这是必要的,所以我可以抛出与该用户相关的那个表上的一些信息),这是我到目前为止所做的:

    [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 个答案:

答案 0 :(得分:1)

你可以这样做:

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

<强>更新
使用LINQ2SQL或EF,由于所谓的导航属性,这应该更简单。基本上,如果您的数据库使用外键正确设置,它们就不需要在C#代码中手动连接。 例如,如果您的表USER_HISTORY对表user_id的列USER有外键约束,那么您的类User将拥有一个属性UserHistories类型IEnumerable<UserHistory>包含所有关联的用户历史记录,类UserHistory将包含属性User。所有其他关联也是如此:用户&lt; - &gt;公司和公司&lt; - &gt;办公室

使用此代码,您的代码可以轻松地重写为:

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