1

私は、最新の LINQ の取り組み (「こんにちは、LINQ は初めてです」) の例を徹底的にグーグル検索しました。私が訪れたページのリストは割愛します。

私が達成したいことのサンプルSQLは次のとおりです。

use myDB;
go

declare @requestedDay datetime = convert(datetime, (convert(varchar(10), getdate(), 101)), 101)
declare @type1 int = 20

;with currentQuery as ( select
case when z.someID = @type1 and bet.someValue is null then 1
    else 0 end as count1,
case when z.someID = @type1 and bet.someValue = alef.otherID then 1
    else 0 end as count2,
from dbo.Work as dalet
    left join dbo.Workers as z on alef.workerAssignedID = z.ID
    left join dbo.Contracts as alef on alef.workOrderID = gimel.ID
    left join dbo.Subcontracts as bet on alef.WorkOrderID = alef.WorkOrderID 
                  and alef.WorkerAssignedID = dalet.WorkerID 
where convert(varchar(10),alef.dateTimeofWork,101) = @requestedDay),
futureQuery as ( select
case when gimel.text_EN like '%blah%' and bet.someValue is null then 1
    else 0 end as count3,
case z.someID = @type1 and bet.someValue = alef.otherID then 1
    else 0 end as count4,
from dbo.Work as dalet
    left join dbo.Workers as z on dalet.workerAssignedID = z.ID
    left join dbo.Contracts as alef on dalet.workOrderID = alef.ID
    left join dbo.Subcontracts as bet on dalet.WorkOrderID = bet.WorkOrderID and wa.WorkerAssignedID = wr.WorkerID 
    left join dbo.Lookups as gimel on dalet.skillID = gimel.ID
where convert(datetime,(convert(varchar(10),alef.dateTimeofWork,101)),101) > @requestedDay)
select sum(count1) as prop1name, sum(count2) as prop2name, 
sum(count3) as prop3name, sum(count4) as prop4name
from currentQuery, futureQuery

もちろん、これははるかに大きなクエリの短縮版です。必要なものの基本だけが含まれています。名前は紛らわしいかもしれませんが、私はユニークなものを探していました. また、以下の LINQ いとことも一致します。

...とは言っても、ここで私は立ち往生しています: (「これまでに試したこと:」) 私が考えようとしている問題を説明するコメントをいくつか含めました。

//snip injection stuff above
    public IQueryable<DailyCasaLatinaReport> DailyCasaLatina(DateTime dateRequested)
    {
        IQueryable<DailyCasaLatinaReport> query;

        var daletQ = waRepo.GetAllQ();
        var zQ = zRepo.GetAllQ();
        var alefQ = alefRepo.GetAllQ();
        var betQ = betRepo.GetAllQ();
        var gimelQ = gimelRepo.GetAllQ();

        int type1 = 20;
        int type2 = 21;

        query = daletQ
                   .GroupJoin(gimelQ, dalet => dalet.skillID, look => look.ID,
                                 (dalet, look) => new
                                 {
                                     dalet,
                                     enSkillText = look.FirstOrDefault().text_EN
                                 }) //currently envisioning a left outer join of
                                    //all .skillID, with English text available
                                    //for column and condition matches from the
                                    //next three joins.
                   .GroupJoin(betQ, gimel => gimel.dalet.workOrderID, wr => wr.WorkOrderID,
                                  (gimel, wr) => new
                                  {
                                      gimel,
                                      reqWorkerID = wr.FirstOrDefault().WorkerID,
                                      reqOrderID = wr.FirstOrDefault().WorkOrderID
                                  }) //now envisioning a join on the original table
                                     //where any match in workerID is joined. THIS
                                     //IS A PROBLEM, I actually need to join on two
                                     //conditions to avoid duplicates.
                   .GroupJoin(alefQ, bet => bet.gimel.dalet.workOrderID, wo => wo.ID,
                                  (bet, wo) => new
                                  {
                                      bet,
                                      timeOfWork = wo.FirstOrDefault().dateTimeofWork
                                  }) //now envisioning yet another join where the
                                     //dateTimeofWork property from woQ is stamped
                                     //onto all matches of woQ's ID column. since
                                     //woQ.ID is the common point of reference for
                                     //like, everything, there should be no nulls.
                   .GroupJoin(zQ, alef => alef.bet.gimel.dalet.workerAssignedID, w => w.ID,
                                 (alef, w) => new
                                {
                                    alef,
                                    listDWC = alef.bet.someValue == 0 ? (w.FirstOrDefault().someID == type1 ? 1 : 0) : 0,
                                    propioDWC = alef.bet.someValue == alef.bet.gimel.dalet.workerAssignedID ? 
                                                    (w.FirstOrDefault().someID == type1 ? 1 : 0) : 0,

                                })  
                                    // here I'm stuck because there's no way to do 
                                    //the future conditions, i.e., what would be my 
                                    //second subquery
                   .Where(x => x.alef.timeOfWork == dateRequested)
                   .GroupBy(y => y.alef.bet.gimel.dalet.ID)
                   .Select(group => new dailyReport
                                {
                                    count1 = group.Sum(z => z.listDWC),
                                    count2 = group.Sum(z => z.propioDWC),
                                    count3 = //???
                                    count4 = //???
                                });

        return query;
    }
//snip class definition below

長い質問で申し訳ありませんが (私はもっと長く見てきましたが)、ここで 2 番目のサブクエリを絞り込む方法についてのアイデアは役に立ちます。私はLINQをよく知りませんし、正直に言って、別の.Where句や2番目の.Select句を入れることができるかどうかもわかりません。注意すべきことの 1 つは、dailyReport は定義済みのクラスであり、(この例では) count1 から count4 までを定義する必要があるということです。

どんな助けにも感謝します、

ハイム

4

1 に答える 1

1

コメントに基づいて、この巨大な sql クエリを分割することは、彼のコードの保守性にとってより有益であると判断され、必要に応じて新しい質問が作成されます。

于 2013-09-25T05:43:06.957 に答える