2017-01-12 8 views
0

を使用して参加した後、テーブルからの和を使用してデータを取得し、私はEDMXがありますか?フリーランサーが新規の場合、FreelancerPaymentテーブルには常にAmountがありません。私はちょうど彼らの詳細と合計でフリーランサーのリストが欲しい。 私はこの試みた:複数のLINQ

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(); 

をしかし、それは返します:すべてのための同じ enter image description here

金額を。どのように特定のフリーランサーのwhere節を入れることができますか?

+1

この収益は、すべてのユーザーに対して個別のクエリを作成しています。その不足している "fl.Freelancrid"。 – Searching

+0

@Searchingは正しい - サブクエリにはwhere句がなく、外側の結果セットに基づいてフィルタリングする方法もありません。 –

+0

ここで「fl.Freelancrid」を追加しますか?私は 'Earn =( fla from db.Freelancersどこfl.FreelancerID.Equals(fla.FreelancerID)'を試みたが、それは500(内部サーバーエラー)を返す – Fawel

答えて

2

あなたの内側のクエリは、外部クエリFreelancerに接続AppliedJobsで始める必要があります。

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

    join jo in db.JobOffers 
    ... 

また、あなたが左外側に合計を計算し、サブクエリ内で合流する必要はありません。

最後に、あなたがやっているやり方によって、それはもっと複雑になります。あなたは素晴らしいナビゲーションプロパティを持っていますので、Don’t use Linq’s Join. Navigate!となり、そのような問題は発生しません。

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() 
    }; 
+0

Linqでは何を意味するのですか? – Fawel

+0

[let節(C#リファレンス)](https://msdn.microsoft.com/en-us/library/bb383976.aspx)オプションです基本的には、クエリ内をナビゲートするとき、プロパティがコレクションであれば 'from x in y.collection'を使い、単純オブジェクトなら' let x = y.object'。 –

+0

あなたは素晴らしいです!それは働いた!@イワンStoev – Fawel