У меня есть этот запрос:
var rights = from gu in db.GroupUsers
join g in db.Groups on gu.GroupId equals g.GroupId
join gr in db.GroupRights on g.GroupId equals gr.GroupId
join r in db.Rights on gr.RightId equals r.RightId
where gu.UserId == userId && g.IsDeleted == false
select r;
Переводится на:
SELECT [t0].[Name] AS Name1, [t0].[RightId] AS RightId1
FROM [dbo].[GroupUsers] AS t1
INNER JOIN [dbo].[Groups] AS t2
ON ([t1].[GroupId] = [t2].[GroupId])
INNER JOIN [dbo].[GroupRights] AS t3
ON ([t2].[GroupId] = [t3].[GroupId])
INNER JOIN [dbo].[Rights] AS t0
ON ([t3].[RightId] = [t0].[RightId])
WHERE (([t1].[UserId] = 3345) AND ([t2].[IsDeleted] = 0))
Это все в порядке, но в .NET мои объекты SubSonic все пусты. Таким образом, запрос возвращает 15 объектов, но Name и RightId являются пустой строкой и -1.
Может ли это быть как-то связано с тем, что Name возвращается как Name1, а RightId возвращается как RightId1?
Я посмотрю исходный код SubSonic3, чтобы что-то найти.
SubSonic3 Исходный код: запрос переводится в SQL выше. Из-за Name1 и RightId1 загрузка в Database.cs не работает должным образом. Линия:
currentProp = cachedProps.SingleOrDefault
(x => x.Name.Equals(pName, StringComparison.InvariantCultureIgnoreCase));
не находит currentProp, потому что currentProp - это Name (и RightId), а не Name1 и RightId1. Ну, исправить это не будет на сегодня. Может быть, кто-то из SubSonic3 может взглянуть на это, потому что это довольно раздражает. Я мог бы написать что-то вроде хака в исходный код, но это не будет красиво. Я предполагаю, что перевод должен быть очищен так, чтобы Name1 и RightId1 были переведены обратно в Name и RightId.
В TSqlFormatter.cs есть следующая строка, которая добавляет эти строки AS
(в методе:
protected override Expression VisitSelect(SelectExpression select)
{
...
if (!string.IsNullOrEmpty(column.Name) && (c == null || c.Name != column.Name))
{
sb.Append(" AS ");
sb.Append(column.Name);
}
...
}
Если я добавлю два добавления в комментарии, тогда мой запрос linq работает, и я получаю правильные данные. Но я думаю, что эти две строки существуют по какой-то причине, но по какой причине? В каком случае нужны две строки?