[英]Linq to SharePoint with Distinct Results
我正在按字母顺序搜索过滤器,并希望从列表中获取结果,并且仅根据列表中的结果显示可用的字母过滤器。 现在棘手的部分是,所需的列是人员字段,我只想获取该人员姓名的首字母。
现在,我可以使用以下代码查询字母,但是谁想要运行26个查询并降低页面加载速度。 此外,所有结果都将显示以字母a开头的用户。 因此,我想我可以做一个限制,使其仅返回一个结果(如果这是唯一的选择)。
SPList UserActivity = web.Lists["User Activity"];
var varUserActivity = (from SPListItem UserActivityItem in UserActivity.Items
where UserActivityItem["Username"].ToString().Substring(UserActivityItem["Username"].ToString().IndexOf('#') + 1, (UserActivityItem["Username"].ToString().Length - UserActivityItem["Username"].ToString().IndexOf('#')) - 1).ToLower().Replace("domain\\","").StartsWith("a")
select UserActivityItem);
foreach (SPListItem uaitem in varUserActivity)
{
this.Controls.Add(new LiteralControl(uaitem["Username"].ToString() + "<br>"));
}
但是我更喜欢运行一个查询,为每个唯一字母返回一个结果。 使用此列表示例数据:
...预期返回的结果是:
从这里,我可以使用以下字母构建过滤器:CLRS。所以我的问题是如何创建一个独特的Linq查询,该查询返回基于第一个字母的结果?
所以我想通了:
这是表数据的示例:
这是数据过滤代码:
using System.Linq;
using Microsoft.SharePoint.Linq;
MyDataContext dc = new MyDataContext("http://localhost");
var varUserActivity = (from item in dc.UserActivityList
orderby item.UsernameName.ToString().Substring(item.UsernameName.ToString().IndexOf('#') + 1, 1).ToLower().Replace("domain\\", "") ascending
select new { letter = item.UsernameName.ToString().Substring(item.UsernameName.ToString().IndexOf('#') + 1, 1).ToLower().Replace("domain\\", "") }).Distinct();
foreach (var uaitem in varUserActivity)
{
this.Controls.Add(new LiteralControl(uaitem.letter + "<br>"));
}
因此,此代码中发生的事情是查询列表中的单个人员列,剥离域,返回帐户名的第一个字母,升序排序并返回不同的字母。 因此,上面的表数据的结果将显示:
这非常适合制作字母过滤器。 我不确定它是否在进行真正的数据过滤,但是可以肯定的是,它可以按字母顺序进行26个不同的查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.