简体   繁体   English

Linq to SharePoint具有独特的结果

[英]Linq to SharePoint with Distinct Results

I'm making an alphabetical search filter, and want to get the results from a list and only show the available letter filters based on what results are in the list. 我正在按字母顺序搜索过滤器,并希望从列表中获取结果,并且仅根据列表中的结果显示可用的字母过滤器。 Now the tricky part, the desired column is a people field, and I only want to get the first letter of the person's name. 现在棘手的部分是,所需的列是人员字段,我只想获取该人员姓名的首字母。

Right now I can use the following code to query a letter, but who wants to run 26 queries and slow page loads. 现在,我可以使用以下代码查询字母,但是谁想要运行26个查询并降低页面加载速度。 In addition, all the results will show of users that start with the letter a. 此外,所有结果都将显示以字母a开头的用户。 So I guess I could do a limit to return only one result, if this was the only option. 因此,我想我可以做一个限制,使其仅返回一个结果(如果这是唯一的选择)。

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>"));
}

But I prefer to run one query, returning one result for each unique letter. 但是我更喜欢运行一个查询,为每个唯一字母返回一个结果。 With this list example data: 使用此列表示例数据:

  1. DOMAIN\\Terra Branford DOMAIN \\ Terra Branford
  2. DOMAIN\\Locke Cole DOMAIN \\ Locke Cole
  3. DOMAIN\\Sabin Figaro DOMAIN \\ Sabin Figaro
  4. DOMAIN\\Setzer Gabbiani DOMAIN \\ Setzer Gabbiani
  5. DOMAIN\\Cyan Garamonde DOMAIN \\ Cyan Garamonde
  6. DOMAIN\\Celes Chere DOMAIN \\ Celes Chere
  7. DOMAIN\\Cid Marquez DOMAIN \\ Cid Marquez

...the results expected to return are: ...预期返回的结果是:

  1. DOMAIN\\Terra Branford DOMAIN \\ Terra Branford
  2. DOMAIN\\Locke Cole DOMAIN \\ Locke Cole
  3. DOMAIN\\Sabin Figaro DOMAIN \\ Sabin Figaro
  4. DOMAIN\\Cyan Garamonde DOMAIN \\ Cyan Garamonde

From here I can build my filter with the letters: CLR S. So my question is how do I create a distinct Linq query that returns results based on first letter? 从这里,我可以使用以下字母构建过滤器:CLRS。所以我的问题是如何创建一个独特的Linq查询,该查询返回基于第一个字母的结果?

So I figured it out: 所以我想通了:

  1. Use /14/bin/SPMetal.exe to export the site URL into a DataContext class file 使用/14/bin/SPMetal.exe将站点URL导出到DataContext类文件中
  2. Import that *.cs class file into your project (find in /14/bin/) 将该* .cs类文件导入到您的项目中(在/ 14 / bin /中查找)
  3. Add references 添加参考
  4. Start Linq to SP using your DataContext 使用您的DataContext启动Linq to SP
  5. Query to your heart's content 查询您内心的满足感

Here's an example of table data: 这是表数据的示例:

  1. DOMAIN\\Terra Branford DOMAIN \\ Terra Branford
  2. DOMAIN\\Locke Cole DOMAIN \\ Locke Cole
  3. DOMAIN\\Sabin Figaro DOMAIN \\ Sabin Figaro
  4. DOMAIN\\Setzer Gabbiani DOMAIN \\ Setzer Gabbiani
  5. DOMAIN\\Cyan Garamonde DOMAIN \\ Cyan Garamonde
  6. DOMAIN\\Celes Chere DOMAIN \\ Celes Chere
  7. DOMAIN\\Cid Marquez DOMAIN \\ Cid Marquez

Here's the data filtering code: 这是数据过滤代码:

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>"));
}

So what's happening in this code is it queries a single people column in a list, strips out the domain, returns the first letter of the account name, sorts ascending and returns distinct letters. 因此,此代码中发生的事情是查询列表中的单个人员列,剥离域,返回帐户名的第一个字母,升序排序并返回不同的字母。 So the result with the above table data will show: 因此,上面的表数据的结果将显示:

  1. c C
  2. l
  3. s s
  4. t Ť

This is perfect for making an alphabetic filter. 这非常适合制作字母过滤器。 I'm not completely sure if it's doing real data filtering or not, but it sure beats doing 26 different queries by letter. 我不确定它是否在进行真正的数据过滤,但是可以肯定的是,它可以按字母顺序进行26个不同的查询。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM