Linq-to-entities orderby выдает ошибку с неоднозначным именем столбца

#c# #mysql #entity-framework #linq-to-entities

#c# #mysql #entity-framework #linq-to-entities

Вопрос:

Я создал запрос в Linq-to-entities (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 часов в течение нескольких дней и в течение нескольких секунд после публикации я нахожу ответ!

Ответ №1:

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

 actions.OrderBy(a => a.DateCreated);
  

Комментарии:

1. Да, я только что попробовал это, и это работает. Я внес поправки в OP. Спасибо за вашу помощь.

Ответ №2:

Возможно, 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
}
  

Комментарии:

1. Это последнее свойство было фактически добавлено позже и не повлияло на общий результат. @Pr0fess0rX дал практически правильный ответ. Спасибо.

2. @SteveA: Да, мой ответ был скорее удачным. Я поддержал его, как только увидел его.