#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: Да, мой ответ был скорее удачным. Я поддержал его, как только увидел его.