Linq 基于if的项目结果Lambda语句
我有一个用户是一家公司的一部分,这家公司可以有多个办公室,因此该用户可以是总部/主办公室的一部分,也可以是另一个办公室的一部分,我是从一个lamdba表达式中投射出来的,但我不知道如何做:如果用户不是总部,请扔掉办公室地址 下面的代码显示了用户,连接到userhistory(2表连接-这是必要的,以便我可以抛出该表中与该用户相关的一些信息),以下是我迄今为止所做的工作:Linq 基于if的项目结果Lambda语句,linq,linq-to-sql,lambda,c#-3.0,Linq,Linq To Sql,Lambda,C# 3.0,我有一个用户是一家公司的一部分,这家公司可以有多个办公室,因此该用户可以是总部/主办公室的一部分,也可以是另一个办公室的一部分,我是从一个lamdba表达式中投射出来的,但我不知道如何做:如果用户不是总部,请扔掉办公室地址 下面的代码显示了用户,连接到userhistory(2表连接-这是必要的,以便我可以抛出该表中与该用户相关的一些信息),以下是我迄今为止所做的工作: [HttpPost] [AjaxOnly] public PartialViewResult GetU
[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; }
}
[HttpPost]
[仅限AjaxOnly]
公共PartialViewResult GetUsers(字符串术语)
{
风险值sf=单一回购(x=>x.Type==x.IsActive&&
(x.Identifier.Contains(term)| | x.Name.Contains(term));
//找地址的公司。。。
var users=\u repo.All()。其中(x=>x.CompanyID==\u sf.CompanyID);
var offices=\u repo.All()。其中(x=>x.CompanyID==\u sf.CompanyID);
var\u users=\u repo.All()
.Join(用户,x=>x.UserID,y=>y.UserID,
(s,u)=>新
{
_s=s,
_用户=u
}).选择(x=>新报价数据
{
Login=x.\u user.Login,
Name=string.Format(“{0}{1}”,x.\u user.FirstName,x.\u user.LastName),
电话=x.\U.Mobile,
//让我知道用户在哪里,如果总部也给我地址。。。
IsBasedInHeadOffice=x.\u user.IsBasedInHeadOffice
//这里:if!IsBasedInHeadOffice=>GetMeAddress
});
返回PartialView(“QuoteUsersUC”,用户);
}
公共类引用数据
{
公共字符串登录{get;set;}
公共字符串名称{get;set;}
公共字符串地址{get;set;}
公共字符串Tel{get;set;}
公共bool IsBasedInHeadOffice{get;set;}
}
我能写得更好/更简单吗?你可以这样做:
.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\u HISTORY
在USER\u id
列上对表USER
有外键约束,您的类User
将具有类型为IEnumerable
的属性UserHistories
,该属性包含所有关联的用户历史记录,而类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);
}
public PartialViewResult GetUsers(字符串术语)
{
var sf=_回购单(x=>x.Type==x.IsActive&&
(x.Identifier.Contains(term)| | x.Name.Contains(term));
变量用户=
sf.用户
.SelectMany(x=>x.userhistory)
.选择(y=>
新引用数据
{
Login=x.Login,
Name=string.Format(“{0}{1}”,
x、 名字,
x、 姓氏),
电话:y.Mobile,
IsBasedInHeadOffice=x.IsBasedInHeadOffice
地址=x.isbased总部?
sf.Office.Address:
字符串。空
}));
返回PartialView(“QuoteUsersUC”,用户);
}
地址是否也在同一数据库中?在一个单独的查询中一次获取所有地址(如果GetMeAddress是这样做的话)可能效率很低。是的,同一个数据库,地址实际上是-var offices=\u repo.all()。其中(x=>x.CompanyID==\u sf.CompanyID);我在上面编写psuedo代码是为了说明我的问题所在,我没有显示新的函数或方法调用。我在上面的代码中有一个错误:*带有语句体的lambda表达式无法转换为表达式树**,这意味着什么?@Haroon:你忘了提到它不是Linq to objects?Linq to SQL或实体需要Linq提供程序来支持表达式树这意味着您不能使用上面的代码,因为您使用的是linq2sql或EF,这些提供程序试图将代码转换为SQL,因此正在使用表达式树。。。您未能将您正在使用L2S或EF的信息添加到您的问题中。@Daniel-好的,那么我仍然可以实现我需要的吗?对不起,丹尼尔!