Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 基于if的项目结果Lambda语句_Linq_Linq To Sql_Lambda_C# 3.0 - Fatal编程技术网

Linq 基于if的项目结果Lambda语句

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

我有一个用户是一家公司的一部分,这家公司可以有多个办公室,因此该用户可以是总部/主办公室的一部分,也可以是另一个办公室的一部分,我是从一个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; }
}
[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-好的,那么我仍然可以实现我需要的吗?对不起,丹尼尔!