Порядок в Linq-to-entity дает двусмысленную ошибку имени столбца - PullRequest
2 голосов
/ 19 апреля 2011

Я создал запрос в Linq-to-entity (4.0), который запутал меня, поскольку я объединяю несколько таблиц, две из которых имеют имя столбца (DateCreated).Когда я пытаюсь использовать orderby между двумя таблицами с одинаковым именем столбца, я получаю следующую ошибку: «Столбец DateCreated» в предложении order является неоднозначным «

Я запутался, поскольку думал, что указание таблицы будет означатьэто передало бы это к запросу SQL.В приведенном ниже примере я указываю 'orderby a.Datecreated', но в TSQL он имеет только ORDER BY DateCreated, когда я ожидал увидеть ORDER BY Extent1. DateCreated.

using (PDFActionsEntities pdfEntities = new PDFActionsEntities())
{
    var actions = (from a in pdfEntities.PDFActions
               join f in pdfEntities.Files on a.FileID equals f.FileID into list1
               from l1 in list1.DefaultIfEmpty()
               join wp in pdfEntities.WebPages on a.WebPageID equals wp.webpageid into list2
               from l2 in list2.DefaultIfEmpty()
               orderby a.DateCreated
               select new
               {
                   ID = a.ID,
                   FileID = a.FileID,
                   WebPageID = a.WebPageID,
                   UserID = a.UserID,
                   FilePath = l1.Path,
                   URLPath = l2.url,
                   DateCreated = a.DateCreated
               });

}
.

Вот T-SQL, который он создает

SELECT
`Extent1`.`FileID`, 
`Extent1`.`ID`, 
`Extent1`.`WebPageID`, 
`Extent1`.`UserID`, 
`Extent2`.`Path`, 
`Extent3`.`url`, 
`Extent1`.`DateCreated`
FROM `tblpdfactions` AS `Extent1` LEFT OUTER JOIN
 `tblfiles` AS `Extent2` ON `Extent1`.`FileID` = `Extent2`.`FileID` LEFT OUTER JOIN 
`tblwebpageprints` AS `Extent3` ON `Extent1`.`WebPageID` = `Extent3`.`webpageid`
ORDER BY `DateCreated` ASC

Я что-то упустил или сделал что-то не так?

PS Это соединение с MySQL, если это что-то меняет.


РЕДАКТИРОВАТЬ:

Сразу после того, как я задал вопрос, я увидел другой вопрос, основанный на левом соединении, что привело меня к записи:

var actions = (from a in pdfEntities.PDFActions
           join f in pdfEntities.Files on a.FileID equals f.FileID into list1
           from l1 in list1.DefaultIfEmpty()
           join wp in pdfEntities.WebPages on a.WebPageID equals wp.webpageid into list2
           from l2 in list2.DefaultIfEmpty()
           select new 
           {
               ID = a.ID,
               FileID = a.FileID,
               WebPageID = a.WebPageID,
               UserID = a.UserID,
               FilePath = l1.Path,
               URLPath = l2.url,
               DateCreated = a.DateCreated
           }).OrderBy(x => x.DateCreated);

Я добавил Orderby на выбор нового.Это сейчас работает.Тем не менее, я все еще не понимаю, почему он не будет делать то же самое, когда orderby находится в основном запросе.Хей-хо!Немного раздражает, что я потратил около 5 часов на это в течение нескольких дней, и через несколько секунд после публикации я нашел ответ!

Ответы [ 2 ]

3 голосов
/ 19 апреля 2011

Вы пытались переместить orderby в конец запроса после ключевого слова select? Как:

actions.OrderBy(a => a.DateCreated);
0 голосов
/ 19 апреля 2011

Возможно, TSQL генерируется как частичная конструкция вашего конкретного оператора select new.Вы пытались изменить название объекта на что-то другое, например:

select new
{
    ID = a.ID,
    FileID = a.FileID,
    WebPageID = a.WebPageID,
    UserID = a.UserID,
    FilePath = l1.Path,
    URLPath = l2.url,
    Created = a.DateCreated  // Change is here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...