私は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 から取得する情報が多いほど、サブクエリが増えてクエリが長くなります
これを達成するための最良の方法は何ですか?ありがとう