почему LINQ To SQL приводит к SQL, как это? - PullRequest
1 голос
/ 22 февраля 2011

Когда LINQ переводит приведенный ниже синтаксис в SQL, предложение (inner) where перемещается в самый внешний запрос.Это очень недружелюбно относится к базе данных.Я написал это как HQL Hibernate (это уместно?), И я написал SQL для многих лун.

Может кто-нибудь помочь объяснить, что дает, или указать мне на пути решения?

        var rc = (
            from dv in (
                from dv_j in (
                    from x in adc.JobManagement
                    join j in adc.Job on x.JobId equals j.JobId
                    join js in adc.JobStatus on j.StatusId equals js.JobStatusId
                    join cm in adc.ClientManagement on j.ClientId equals cm.ClientId
                    join o in adc.User on cm.UserId equals o.UserId
                    join jm in adc.JobManagement on j.JobId equals jm.JobId
                    where
                        (x.UserId == aid || cm.UserId == aid)
                        && (j.StatusDate == null || j.StatusDate >= getFromDate())
                        && (jm.ManagementRoleCode == MR_MANAGER)
                    select new
                    {
                        j.JobId,
                        Job = j.InternalName == null ? j.ExternalName : j.InternalName,
                        JobStatusDate = j.StatusDate,
                        JobStatus = js.Code,
                        Owner = o.Username,
                        Role = jm.ManagementRoleCode
                    })
                join s in adc.Submission on dv_j.JobId equals s.JobId into dv_s
                from s in dv_s.DefaultIfEmpty()
                select new
                {
                    dv_j.JobId,
                    dv_j.Job,
                    dv_j.JobStatusDate,
                    dv_j.JobStatus,
                    dv_j.Owner,
                    dv_j.Role,
                    s.SubmissionId,
                    s.CandidateId,
                    s.SubmissionDate,
                    StatusDate = s.StatusDate,
                    StatusId = s.StatusId
                })
            join c in adc.Candidate on dv.CandidateId equals c.CandidateId into dv_c
            join ss in adc.SubmissionStatus on dv.StatusId equals ss.SubmissionStatusId into dv_ss
            from c in dv_c.DefaultIfEmpty()
            from ss in dv_ss.DefaultIfEmpty()
            orderby
                dv.StatusId == null ? dv.StatusDate : dv.JobStatusDate descending,
                dv.Job,
                c.LastName,
                c.NickName,
                c.FirstName
            select new Projects
            {
                Id = dv.JobId,
                Project = dv.Job,
                Submitted = dv.SubmissionDate,
                Candidate = FormatIndividual(c.LastName, c.FirstName, c.NickName),
                Status = dv.StatusId == null ? ss.Code : dv.JobStatus,
                StatusDate = dv.StatusId == null ? dv.StatusDate : dv.JobStatusDate,
                Role = dv.Role,
                Owner = dv.Owner
            });

1 Ответ

0 голосов
/ 22 февраля 2011

Попробуйте разбить одно утверждение на два.Это будет работать, так как не может переместить местоположение в место, которое еще не существует.Это делает несколько обращений к базе данных, но это лучше, чем объединять большинство из нескольких больших таблиц, а затем отбирать их.Я бы попробовал это:

var inMemoryTable = (
    from x in adc.JobManagement
    join j in adc.Job on x.JobId equals j.JobId
    join js in adc.JobStatus on j.StatusId equals js.JobStatusId
    join cm in adc.ClientManagement on j.ClientId equals cm.ClientId
    join o in adc.User on cm.UserId equals o.UserId
    join jm in adc.JobManagement on j.JobId equals jm.JobId
    where
        (x.UserId == aid || cm.UserId == aid)
        && (j.StatusDate == null || j.StatusDate >= getFromDate())
        && (jm.ManagementRoleCode == MR_MANAGER)
    select new
    {
        j.JobId,
        Job = j.InternalName == null ? j.ExternalName : j.InternalName,
        JobStatusDate = j.StatusDate,
        JobStatus = js.Code,
        Owner = o.Username,
        Role = jm.ManagementRoleCode
    });

var rc = (
    from dv in (
        from dv_j in inMemoryTable
        join s in adc.Submission on dv_j.JobId equals s.JobId into dv_s
        from s in dv_s.DefaultIfEmpty()
        select new
        {
            dv_j.JobId,
            dv_j.Job,
            dv_j.JobStatusDate,
            dv_j.JobStatus,
            dv_j.Owner,
            dv_j.Role,
            s.SubmissionId,
            s.CandidateId,
            s.SubmissionDate,
            StatusDate = s.StatusDate,
            StatusId = s.StatusId
        })
    join c in adc.Candidate on dv.CandidateId equals c.CandidateId into dv_c
    join ss in adc.SubmissionStatus on dv.StatusId equals ss.SubmissionStatusId into dv_ss
    from c in dv_c.DefaultIfEmpty()
    from ss in dv_ss.DefaultIfEmpty()
    orderby
        dv.StatusId == null ? dv.StatusDate : dv.JobStatusDate descending,
        dv.Job,
        c.LastName,
        c.NickName,
        c.FirstName
    select new Projects
    {
        Id = dv.JobId,
        Project = dv.Job,
        Submitted = dv.SubmissionDate,
        Candidate = FormatIndividual(c.LastName, c.FirstName, c.NickName),
        Status = dv.StatusId == null ? ss.Code : dv.JobStatus,
        StatusDate = dv.StatusId == null ? dv.StatusDate : dv.JobStatusDate,
        Role = dv.Role,
        Owner = dv.Owner
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...