我有一个公司的用户,该公司可以有多个办公室,所以用户可以成为总部/主办公室的一部分或另一个办公室的一部分,我从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; }
}
我能写得更好/更简单吗?
答案 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);
}