SubSonic3 linq проблема - PullRequest
       12

SubSonic3 linq проблема

1 голос
/ 16 января 2010

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

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 работает, и я получаю правильные данные. Но я думаю, что эти две строки существуют по какой-то причине, но по какой причине? В каком случае нужны две строки?

...