SubSonic3 linq问题

时间:2010-01-16 09:30:39

标签: linq subsonic subsonic3

我有这个问题:

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。

这与Name1作为Name1返回并且RightId作为RightId1返回这一事实有什么关系吗?

我将查看SubSonic3的源代码以找到一些东西。

SubSonic3源代码:查询确实被转换为上面的sql。由于Name1和RightId1,Database.cs中的Load无法正常工作。这一行:

currentProp = cachedProps.SingleOrDefault
    (x => x.Name.Equals(pName, StringComparison.InvariantCultureIgnoreCase));

找不到currentProp,因为currentProp是Name(和RightId)而不是Name1和RightId1。好吧,解决这个问题不适合今天。也许SubSonic3的某个人可以看看这个,因为它很烦人。我可以在源代码中编写一些hack,但它不会很漂亮。我想应该清理翻译,以便将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);
    }
    ...
}

如果我将两个Append放在评论中,那么我的linq查询确实有效,我确实得到了正确的数据。但我猜这两条线是有原因的,但是什么原因呢?哪个用例是必要的两行?

0 个答案:

没有答案