我正在制作按字母顺序排列的搜索过滤器,并希望从列表中获取结果,并根据列表中的结果显示可用的字母过滤器。现在是棘手的部分,所需的列是一个人员字段,我只想得到该人名的第一个字母。
现在我可以使用以下代码查询一个字母,但是谁想要运行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>"));
}
但我更喜欢运行一个查询,为每个唯一的字母返回一个结果。使用此列表示例数据:
...预期返回的结果是:
从这里我可以使用字母构建我的过滤器:C L R S.所以我的问题是如何创建一个基于首字母返回结果的独特Linq查询?
答案 0 :(得分:0)
所以我明白了:
这是表格数据的一个例子:
这是数据过滤代码:
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次不同的查询。