1

私はlinqとして入れようとしているこのクエリを持っています:

select * 
from stuff
inner join stuffowner so on so.stuffID = stuff.stuffID
left outer join (select  min(loanId) as loanId, stuffownerId from loan  
 where userid = 1 and status <> 2 group by stuffownerId) t on t.stuffownerid = so.stuffownerid
left outer join loan on t.LoanId = loan.LoanId

これが完了したら、linq Group by を実行して、Stuff にキーを設定し、次に stuffowners + Loan を値として設定したいと考えています。

サブクエリなしでは素敵なクエリに到達できないようです(したがって、二重の左外側)。

つまり、基本的に私のクエリが行うことは、データベースにあるものごとに所有者を連れてきて、ユーザーがそのものに対して行った最初のローンを持ってきたいということです。

私はさまざまなlinqを試しました:

from stuff in Stuffs
join so in StuffOwners on stuff.StuffId equals so.StuffId
join  tLoan in Loans on so.StuffOwnerId equals tLoan.StuffOwnerId into tmpJoin 
from tTmpJoin in tmpJoin.DefaultIfEmpty()
group tTmpJoin by new {stuff}  into grouped
select new {grouped, fluk = (int?)grouped.Max(w=> w.Status )}

所有者を取得できず、その上に多くのクエリが生成されるように見えるため、これは良くありません (LinqPad)

from stuff in Stuffs
join so in StuffOwners on stuff.StuffId equals so.StuffId
join tmpLoan in 
 (from tLoan in Loans group tLoan by  tLoan.StuffOwnerId into g 
 select new {StuffOwnerId = g.Key, loanid = (from t2 in g select t2.LoanId).Max()})
 on so.StuffOwnerId equals tmpLoan.StuffOwnerId
 into tmptmp  from tMaxLoan in tmptmp.DefaultIfEmpty()
select new {stuff, so, tmptmp}

多くのサブクエリも生成されるようです。

私は let keyworkd を試しました:

from  tstuffOwner in StuffOwners 
let tloan = Loans.Where(p2 => tstuffOwner.StuffOwnerId == p2.StuffOwnerId).FirstOrDefault()
select new { qsdq = tstuffOwner, qsdsq= (int?) tloan.Status, kwk= (int?) tloan.UserId, kiwk=  tloan.ReturnDate  }

しかし、tLoan から取得する情報が多いほど、サブクエリが増えてクエリが長くなります

これを達成するための最良の方法は何ですか?ありがとう

4

0 に答える 0