Как создать LINQ из сложного SQL? - PullRequest
0 голосов
/ 04 июля 2018

У меня есть SQL-запрос:

 SELECT D.ID
 FROM Documents AS D
 INNER JOIN DocClasses AS DC WITH (NOLOCK) 
 ON D.DocClass = DC.ID
 INNER JOIN DocSubClasses AS DSC WITH (NOLOCK) 
 ON D.DocSubClass = DSC.ID AND DSC.DocClassID = DC.ID
 INNER JOIN DocPathFolders AS F WITH (NOLOCK) 
 ON D.DocPathFolderID = F.ID
 WHERE 
    DC.ShortName = 'PAY' AND DSC.Name = 'xxxxx' 
    AND UPPER(F.Description) = 'READY TO SEND'

Я пытаюсь преобразовать этот запрос в LINQ. Вот что я сделал до сих пор:

 from D in ctx.Documents
 join DC in ctx.DocClasses on D.DocClass equals DC.ID
 join DSC in ctx.DocSubClasses 
     on new { D.DocSubClass, DSC.DocClassID } equals new { DSC.ID, DC.ID }
 join F in ctx.DocPathFolders 
     on D.DocPathFolderID equals F.ID
 where 
     DC.ShortName == "PAY" 
     && DSC.Name == "xxxxx" 
     && (F.Description).ToUpper() == "READY TO SEND"
 select D.ID;

Я получаю сообщение об ошибке в этой строке:

join DSC in ctx.DocSubClasses on new { D.DocSubClass, DSC.DocClassID } equals new { DSC.ID, DC.ID }

Здесь я получаю следующую ошибку:

Имя 'DSC' не находится в области видимости слева от 'equals'

Имя «DC» не находится в области действия справа от «равно»

Я новичок в LINQ, и поэтому не могу решить эту ошибку. Я хотел бы высказать любое предложение по вышеизложенному. Благодаря.

Ответы [ 5 ]

0 голосов
/ 04 июля 2018

Вы можете попробовать с Lambda Присоединиться вместо использования LINQ.

Ваши JOIN утверждения выглядят как ниже в Lambda.

C # Скрипка

var result = ctx.Documents.Join(ctx.DocClasses , d => new { Id = d.DocClass }, dc => new { Id = dc.ID }, (d, dc) => new { doc = d, docClass = dc }) //INNER JOIN DocClasses  
                          .Join(ctx.DocSubClasses , d => new { sc = d.doc.DocSubClass, Id = d.docClass.ID }, dsc => new { sc = dsc.ID, Id = dsc.DocClassID }, (d, dsc) => new { doc = d, dsc = dsc } ) //INNER JOIN DocSubClasses
                          .Join(ctx.DocPathFolders, d => new { fId = d.doc.doc.DocPathFolderID }, f => new { fId = f.ID }, (d, f) => new { doc = d, f = f }) //INNER JOIN DocPathFolders
                          .Where(x => x.doc.doc.docClass.ShortName == "PAY" && x.doc.dsc.Name == "xxxxx" && x.f.Description.ToUpper() == "READY TO SEND")//Apply where clause
                          .Select(y => y.doc.doc.doc.ID);//Select whatever you want
0 голосов
/ 04 июля 2018

Подсказка: при условии, что вы правильно установили свои отношения в своей базе данных, вам почти никогда не нужно использовать «соединение». В LINQ легче писать, а отношения выставляются как «навигационные свойства». Вы просто используете «точечную нотацию». то есть:

var result = from d in ctx.Documents
           where d.DocClasses.Any( dc => dc.ShortName == "PAY" 
              && dc.DocSubClasses.Any( dsc => dsc.Name == "xxxxx" )
              && d.DocPathFolders.Any( dpf => dpf.Description.ToUpper() == "READY TO SEND" )
            select d.ID;

Примечание: мы не имеем никакого представления о вашей модели. Я принял отношения как 1-ко-многим. Если бы это был Many-To-1, вы бы просто использовали нотацию, например:

where d.DocClass.ShortName == "PAY" 
                  && d.DocClass.DocSubClass.Name == "xxxxx" 
                  && d.DocPathFolder.Description.ToUpper() == "READY TO SEND" 

СОВЕТ2: Загрузите и начните использовать Linqpad с LinqPad.net. Это отличный инструмент, с помощью которого вы можете не только протестировать свои запросы LINQ, но и использовать его как блокнот .Net.

0 голосов
/ 04 июля 2018

Вы должны переупорядочить свойства в анонимных объектах следующим образом:

join DSC in ctx.DocSubClasses 
on new { D.DocSubClass, DC.ID } equals new { DSC.DocClassID, DSC.ID }

Справа должны быть таблицы, к которым вы присоединяетесь (DSC), а слева - таблицы предыдущих

0 голосов
/ 04 июля 2018

Просто переключите DSC в правую сторону от равных и DC влево, и все должно работать нормально.

join DSC in ctx.DocSubClasses on new { D.DocSubClass, DC.ID } equals new { DSC.ID, DSC.DocClassID}
0 голосов
/ 04 июля 2018

Вот как я решил свою проблему:

from D in ctx.Documents
join DC in ctx.DocClasses on D.DocClass equals DC.ID
join DSC in ctx.DocSubClasses on new { D.DocSubClass, DC.ID } equals new { DocSubClass = DSC.ID, ID = DSC.DocClassID }
join F in ctx.DocPathFolders on D.DocPathFolderID equals F.ID
where DC.ShortName == "PAY" && DSC.Name == "xxxx" && (F.Description).ToUpper() == "READY TO SEND"
select D.ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...