我怎么在Linq to Sql中得到这个?

时间:2011-04-02 02:00:54

标签: sql asp.net-mvc linq-to-sql

为了给你一些上下文,我的数据库表看起来像这样:

用户
- 用户ID
- 姓名

消息
- 消息ID
- SenderUserID
- RecipientUserID

查看
- ViewID
- VieweeUserID
- ViewerUserID

使用单个LINQ to SQL语句,我希望让所有用户“浏览”“Messaging”成为用户并将其放入如下对象:

交互器
- 姓名(观众或消息者)
- NumberOfMessagesSent
- NumberOfTimesViewed

我已经尝试了很长时间才能得到我想要的东西,但每次我似乎都得到了疯狂的数据,所以我显然做错了什么......请帮忙!

1 个答案:

答案 0 :(得分:1)

模型上关系的名称可能会有所不同(这就是LinqPad命名的方式),但这是我认为你要完成的事情:

Users.Select(u => new Interactor { 
                                   Name = u.Name, 
                                   NumberOfMessagesSent = u.SenderIdMessages.Count,
                                   NumberOfTimesViewed = u.ViewerIdViews.Count 
                                 })
     .Where(i => i.NumberOfMessagesSent > 0 || i.NumberOfTimesViewed > 0);

生成的SQL:

SELECT [t3].[Name], [t3].[value] AS [NumberOfMessagesSent], [t3].[value2] AS [NumberOfTimesViewed]
FROM (
    SELECT [t0].[Name], (
        SELECT COUNT(*)
        FROM [Message] AS [t1]
        WHERE [t1].[SenderId] = [t0].[UserId]
        ) AS [value], (
        SELECT COUNT(*)
        FROM [View] AS [t2]
        WHERE [t2].[ViewerId] = [t0].[UserId]
        ) AS [value2]
    FROM [User] AS [t0]
    ) AS [t3]
WHERE ([t3].[value] > @p0) OR ([t3].[value2] > @p1)