Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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
C# 使用LINQ在多次联接后从表中获取具有Sum的数据_C#_Asp.net Mvc_Linq_Join_Asp.net Web Api - Fatal编程技术网

C# 使用LINQ在多次联接后从表中获取具有Sum的数据

C# 使用LINQ在多次联接后从表中获取具有Sum的数据,c#,asp.net-mvc,linq,join,asp.net-web-api,C#,Asp.net Mvc,Linq,Join,Asp.net Web Api,我有EDMX: 如果有,我如何从自由职业者支付表中获得单个自由职业者的金额总和?如果自由职业者是新来的,则所有时间自由职业者付款表都没有金额。我只想自由职业者的详细资料和总收入列表。 我试过这个: var freelancers = (from fl in db.FreelancerLogins join f in db.Freelancers on fl.FreelancerID eq

我有EDMX:

如果有,我如何从自由职业者支付表中获得单个自由职业者的金额总和?如果自由职业者是新来的,则所有时间自由职业者付款表都没有金额。我只想自由职业者的详细资料和总收入列表。 我试过这个:

var freelancers = (from fl in db.FreelancerLogins
                           join f in db.Freelancers
                           on fl.FreelancerID equals f.FreelancerID
                           select new
                           {
                               FreelancerID = fl.FreelancerID,
                               UserName = fl.UserName,
                               EmailAddress = fl.EmailAddress,
                               EmailConfirmed = fl.EmailConfirmed,
                               Status = fl.Status,
                               LogInTime = fl.LogInTime,
                               LogOutTime = fl.LogOutTime,
                               Picture = f.Picture,
                               Title = f.Title,
                               Name = f.FirstName + " " + f.LastName,
                               Overview = f.Overview,
                               JoiningDate = f.JoiningDate,
                               BirthDay = f.BirthDay,
                               Rate = f.Rate,
                               Location = f.Location,
                               //Earn = (fp.Amount == null ? 0 : fp.Amount)
                               Earn=(
                               from fla in db.Freelancers
                           join apl in db.AppliedJobs
                           on fla.FreelancerID equals apl.FreelancerID into apll
                           from ap in apll.DefaultIfEmpty()

                           join jo in db.JobOffers
                           on ap.AppliedJobID equals jo.AppliedJobID into joo
                           from jobo in joo.DefaultIfEmpty()


                           join c in db.Contracts
                           on jobo.OfferID equals c.OfferID into coo
                           from con in coo.DefaultIfEmpty()

                           join fpay in db.FreelancerPayments
                           on con.ContractID equals fpay.ContractID into fpayy
                           from fp in fpayy.DefaultIfEmpty()

                                   select fp.Amount).Sum()


                           }).AsEnumerable();

        return freelancers.AsEnumerable();
但它的回报是:


所有人的金额相同。如何为特定的自由职业者设置where子句?

您的内部查询应该以连接到外部查询的
AppliedJobs
开始:

Earn = (
    from ap in db.AppliedJobs
    where f.FreelancerID == ap.FreelancerID

    join jo in db.JobOffers
    ...
此外,在计算总和的子查询中不需要左外联接

最后,你做这件事的方式让事情变得比应该的更复杂。您有很好的导航属性,因此不会出现以下问题:

var query = 
    from f in db.Freelancers
    let fl = f.FreelancerLogin
    select new
    {
        FreelancerID = fl.FreelancerID,
        UserName = fl.UserName,
        // ...
        Earn = (from ap in f.AppliedJobs
                from jo in ap.JofOffers
                from c in jo.Contracts
                let fp = c.FreelancerPayment
                select fp.Amount).DefaultIfEmpty().Sum()
    };

您的内部查询应该以连接到外部查询的
自由职业者的
AppliedJobs
开始:

Earn = (
    from ap in db.AppliedJobs
    where f.FreelancerID == ap.FreelancerID

    join jo in db.JobOffers
    ...
此外,在计算总和的子查询中不需要左外联接

最后,你做这件事的方式让事情变得比应该的更复杂。您有很好的导航属性,因此不会出现以下问题:

var query = 
    from f in db.Freelancers
    let fl = f.FreelancerLogin
    select new
    {
        FreelancerID = fl.FreelancerID,
        UserName = fl.UserName,
        // ...
        Earn = (from ap in f.AppliedJobs
                from jo in ap.JofOffers
                from c in jo.Contracts
                let fp = c.FreelancerPayment
                select fp.Amount).DefaultIfEmpty().Sum()
    };

earn正在对所有用户进行单独的查询。它缺少的
fl.Freelancrid
@search是正确的-子查询中没有where子句,也没有基于外部结果集的过滤方式。我在其中添加了“fl.Freelancrid”?我尝试了
Earn=(从db.freegorers中的fla开始,其中fl.freegorerid.Equals(fla.freegorerid)
但它返回500(内部服务器错误)正确的位置,但只需
where fla.Freelancrid==fl.Freelancrid
即可。相同的服务器错误!earn正在对所有用户进行自己的单独查询。其缺少的
fl.Freelancrid
@search是正确的-子查询中没有where子句,也没有基于外部结果集的过滤方式。我在此处添加“fl.Freelancrid”?我尝试了
Earn=(从db.freelangers中的fla开始,其中fl.Freelancrid.Equals(fla.Freelancrid)
但返回500(内部服务器错误)正确的位置,但只需
其中fla.Freelancrid==fl.Freelancrid
即可。相同的服务器错误!在Linq中“let”是什么意思?。这里是可选的,我使用它来保持变量的原样。基本上是在“导航”时“在查询中,如果属性是collection,则使用y.collection中x的
,如果是simple object,则使用
让x=y.object
。“let”在Linq中是什么意思?。在这里是可选的,我使用它来保持变量的原样。基本上是在“导航”时”在查询内部,如果属性是collection,则使用y.collection中x的
,如果是simple object,则使用
让x=y.object