【发布时间】:2013-12-13 23:17:29
【问题描述】:
我有一个 Telerik RadGrid,在它绑定到的数据源中有以下 Select 查询:
SELECT g.GroupID,
c.ClientName,
r.CarrierName,
p.PlanName
FROM Group AS g
JOIN Client AS c
ON g.ClientID=c.ClientID
JOIN Carrier AS r
ON g.CarrierID=r.CarrierID
JOIN Plan AS p
ON g.PlanID=p.PlanID
RadGrid 具有可过滤的列,后面的代码将过滤器存储在 Session 中,以便当您导航回页面时,过滤器会被保留。后面的代码有效地将 WHERE 子句附加到 Select 查询中:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
...
radGrid.MasterTableView.FilterExpression = string.Format("([ClientName] LIKE '%{0}%' AND [CarrierName] LIKE '%{1}%' AND [PlanName] LIKE '%{2}%')",
clientName, carrierName, planName);
...
radGrid.Rebind();
...
}
}
查询的完整结果(未过滤时)超过 4,000 行,因此网格也是分页的。
问题
我需要在页面上添加一个复选框,该复选框将过滤网格以仅显示没有存储在数据库中的联系人的组。我已经在页面中添加了一个复选框,它的状态与过滤器信息(以及页面上的其他一些字段)一起保存在Session 中。一切正常。
然而,事实证明,要根据该复选框正确过滤网格是很困难的。联系人存储在Contacts 表中,该表有一个列ClientID 来匹配Client.ClientID/Group.ClientID,尽管不涉及任何外键。 (Client、Carrier 和 Plan 实际上是远程数据库上的表的镜像,这些表会定期更新,因此即使我有权这样做,对它们的更改也会被覆盖。)
在 Microsoft SQL Server Management Studio 中测试查询,以下为我提供了我需要的信息:
SELECT g.GroupID,
c.ClientName,
r.CarrierName,
p.PlanName,
con.Contacts
FROM Group AS g
JOIN Client AS c
ON g.ClientID=c.ClientID
JOIN Carrier AS r
ON g.CarrierID=r.CarrierID
JOIN Plan AS p
ON g.PlanID=p.PlanID
INNER JOIN
(
SELECT COUNT(*) AS Contacts, ClientID
FROM Contacts
GROUP BY ClientID
) AS con
ON g.ClientID=con.ClientID
但是,如果我修改 RadGrid 的数据源以反映此查询并修改后面代码中的 FilterExpression 以包含 AND [Contacts]=0(或未选中时为空字符串)和将上面的FilterExpression 代码添加到我的_CheckedChanged 回调方法中,选中复选框时过滤结果不正确(网格包含行,而数据库当前不包含没有联系人的组),并且网格非常当复选框未选中时,使用普通过滤器更新缓慢。
- 有没有更好的方法将我的网格绑定到这组信息?
- 查询在理论上有效但在实践中无效的原因可能是什么?
【问题讨论】:
标签: c# asp.net sql-server telerik-grid