我创建了以下表格:
表#1:tbl_Connections
USE [taaraf_db]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tbl_Connections](
[uc_Id] [int] IDENTITY(1,1) NOT NULL,
[uc_User] [nvarchar](50) NOT NULL,
[uc_Connection] [nvarchar](50) NOT NULL,
[uc_IsPending] [int] NOT NULL,
[uc_DateTime] [datetime] NOT NULL,
CONSTRAINT [PK_tbl_Connections] PRIMARY KEY CLUSTERED
(
[uc_Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[tbl_Connections] ADD CONSTRAINT [DF_tbl_Connections_uc_IsPending] DEFAULT ((1)) FOR [uc_IsPending]
GO
表#2:tbl_LiveStream
USE [taaraf_db]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tbl_LiveStreams](
[ls_Id] [int] IDENTITY(1,1) NOT NULL,
[ls_Story] [nvarchar](max) NOT NULL,
[ls_User] [nvarchar](50) NOT NULL,
[ls_Connection] [nvarchar](50) NOT NULL,
[ls_DateTime] [datetime] NOT NULL,
CONSTRAINT [PK_tbl_LiveStreams] PRIMARY KEY CLUSTERED
(
[ls_Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
现在,tbl_Connections中的uc_User表示发起好友请求的用户和uc_Connection 代表另一方。 相同的概念应用于第二个表(tbl_LiveStreams)
我正在尝试为cetrain用户选择所有新的LiveStreams,只有当该用户连接到另一方时才应为特定用户检索LiveStream(uc_IsPending = 0)
我有一个C#函数,它接受以下参数:
public static DataTable GetAsyncLiveStream(string CurrentUser, int startAt, int howMany) { ... }
如上所述,如果上面指定的要求为真,DataTable应返回LiveStream中给定CurrentUser(ls_User)的所有新项目。
这有点像Facebook新闻提要,与朋友一起发生的事情...... 哦,是的,每当有人(ls_User)向(ls_Connection)发起某种特定事件时,就会填充tbl_LiveStream。
我不确定我是否让我的生活变得复杂,但这就是我所拥有的,所有的帮助都得到了赞赏。
我应该提一下,我已经通过循环遍历来自tbl_LiveStream的所有返回记录并使用自定义类函数.IsFriends()进行了一些验证,它将检查数据库中的友谊状态并以编程方式填充DataTable。我承认,这有点愚蠢。但我不知道该怎么做。
最后一件事, 我正在使用以下查询返回有限的结果:
SELECT * FROM (
SELECT row_number() OVER (ORDER BY ) AS rownum, ls_Id
FROM )
AS A
WHERE A.rownum BETWEEN (@start) AND (@start + @rowsperpage)
请帮助并感谢您的时间。
修改 我想请注意,这就是我如何从tbl_Connections表中获取谁的朋友。
const string sql = "SELECT REPLACE((uc_Connection + uc_User), @CurrentUser, '') AS Connection " +
"FROM tbl_Connections Connection " +
"WHERE (@CurrentUser = uc_Connection) OR (@CurrentUser = uc_User)";
答案 0 :(得分:0)
SELECT * FROM (
SELECT row_number() OVER (ORDER BY ) AS rownum, ls_Id
FROM )
AS A
WHERE A.rownum BETWEEN (@start) AND (@start + @rowsperpage)
这种语法错了。你不能这样做。使用Union,或使用LINQ to SQL。
从批评的角度来看,不要获取DataTables,获取实体。你可能不熟悉的技术似乎过于复杂。我建议获取所有当前存在的数据并将其转储到CSV文件,然后从头开始使用类似Sharp Architecture的应用程序,这可以为您抽象出一些细节。