C# 使用LINQ在多次联接后从表中获取具有Sum的数据
我有EDMX: 如果有,我如何从自由职业者支付表中获得单个自由职业者的金额总和?如果自由职业者是新来的,则所有时间自由职业者付款表都没有金额。我只想自由职业者的详细资料和总收入列表。 我试过这个: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
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
。