Linq - 按姓名首字母分组
Linq - Group by first letter of name
我正在使用 Entity Framework 6 作为我的数据源。
我创建了一个页面,将按供应商名称的第一个字母列出供应商,所以首先我们有所有的“A”,然后是“B”,依此类推。
为此,我使用了 2 个 ListView 对象 - 它很容易成为 Repeater,但这并不重要。
虽然我的供应商名单并不广泛,但我用来获取数据的方法非常昂贵,因为我必须在数据绑定期间调用它 27 次。我很确定有更好的方法来解决这个问题,但我不太了解 Linq。
我在想一定有一种方法可以对数据进行分组,然后循环遍历组的内容。
这是重要的代码。检索子数据和数据绑定代码的 linq:
public static IEnumerable<Supplier> StartsWith(string firstLetter)
{
return Select() // select simply returns all data for the entity
.Where(x => x.Name.StartsWith(firstLetter, StringComparison.OrdinalIgnoreCase));
}
protected void ListViewAtoZ_ItemDataBound(object source, ListViewItemEventArgs e)
{
var item = e.Item;
if (item.ItemType == ListViewItemType.DataItem)
{
var alphanumeric = (string)item.DataItem;
var h2 = item.GetControl<HtmlGenericControl>("HtmlH2", true);
h2.InnerText = alphanumeric;
var childView = item.GetControl<ListView>("ListViewStartsWith", true);
childView.DataSource = LenderView.StartsWith(alphanumeric);
childView.DataBind();
}
}
protected void ListViewStartsWith_ItemDataBound(object source, ListViewItemEventArgs e)
{
var item = e.Item;
if (item.ItemType == ListViewItemType.DataItem)
{
var supplier = (Supplier)item.DataItem;
var litName = item.GetControl<Literal>("LiteralName", true);
litName.Text = supplier.Name;
}
}
void LoadData()
{
var alphanumerics = new string[]
{
"0 - 9","A","B","C","D","E","F","G","H","I","J","K","L",
"M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
};
ListViewAtoZ.DataSource = alphanumerics;
ListViewAtoZ.DataBind();
}
I'm thinking there must be a way of grouping data and then looping through the content of a group.
是的,有。
尝试以下内容
Select().GroupBy(c=>string.IsNullOrEmpty(c.Name) ? '' : c.Name[0]);
刚刚添加 string.IsNullOrEmpty
以确保字符串不为空。
您可以使用以下方法分组并获取项目的子列表。
Select().GroupBy(x => x.Name.Substring(0,1).ToUpper(), (alphabet, subList) => new { Alphabet = alphabet, SubList = subList.OrderBy(x => x.Name).ToList() })
.OrderBy(x => x.Alphabet)
以上代码应在一次迭代中对所有数据进行分组。该代码适用于 LINQ to objects。对于 LINQ to entities 也应该以相同的方式工作。
我正在使用 Entity Framework 6 作为我的数据源。
我创建了一个页面,将按供应商名称的第一个字母列出供应商,所以首先我们有所有的“A”,然后是“B”,依此类推。
为此,我使用了 2 个 ListView 对象 - 它很容易成为 Repeater,但这并不重要。
虽然我的供应商名单并不广泛,但我用来获取数据的方法非常昂贵,因为我必须在数据绑定期间调用它 27 次。我很确定有更好的方法来解决这个问题,但我不太了解 Linq。
我在想一定有一种方法可以对数据进行分组,然后循环遍历组的内容。
这是重要的代码。检索子数据和数据绑定代码的 linq:
public static IEnumerable<Supplier> StartsWith(string firstLetter)
{
return Select() // select simply returns all data for the entity
.Where(x => x.Name.StartsWith(firstLetter, StringComparison.OrdinalIgnoreCase));
}
protected void ListViewAtoZ_ItemDataBound(object source, ListViewItemEventArgs e)
{
var item = e.Item;
if (item.ItemType == ListViewItemType.DataItem)
{
var alphanumeric = (string)item.DataItem;
var h2 = item.GetControl<HtmlGenericControl>("HtmlH2", true);
h2.InnerText = alphanumeric;
var childView = item.GetControl<ListView>("ListViewStartsWith", true);
childView.DataSource = LenderView.StartsWith(alphanumeric);
childView.DataBind();
}
}
protected void ListViewStartsWith_ItemDataBound(object source, ListViewItemEventArgs e)
{
var item = e.Item;
if (item.ItemType == ListViewItemType.DataItem)
{
var supplier = (Supplier)item.DataItem;
var litName = item.GetControl<Literal>("LiteralName", true);
litName.Text = supplier.Name;
}
}
void LoadData()
{
var alphanumerics = new string[]
{
"0 - 9","A","B","C","D","E","F","G","H","I","J","K","L",
"M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
};
ListViewAtoZ.DataSource = alphanumerics;
ListViewAtoZ.DataBind();
}
I'm thinking there must be a way of grouping data and then looping through the content of a group.
是的,有。 尝试以下内容
Select().GroupBy(c=>string.IsNullOrEmpty(c.Name) ? '' : c.Name[0]);
刚刚添加 string.IsNullOrEmpty
以确保字符串不为空。
您可以使用以下方法分组并获取项目的子列表。
Select().GroupBy(x => x.Name.Substring(0,1).ToUpper(), (alphabet, subList) => new { Alphabet = alphabet, SubList = subList.OrderBy(x => x.Name).ToList() })
.OrderBy(x => x.Alphabet)
以上代码应在一次迭代中对所有数据进行分组。该代码适用于 LINQ to objects。对于 LINQ to entities 也应该以相同的方式工作。