C# Linq-按名称的第一个字母分组
我使用EntityFramework6作为数据源 我已经创建了一个页面,该页面将按供应商名称的第一个字母列出供应商,因此首先我们有所有的“a”,然后是“B”,依此类推 为了做到这一点,我使用了2个ListView对象——它可以很容易地成为一个中继器,但这并不重要 虽然我的供应商名单不多,但我用来获取数据的方法非常昂贵,因为在数据绑定期间我必须调用它27次。我很确定有更好的方法来解决这个问题,但我对Linq的了解还不够 我认为一定有一种方法可以对数据进行分组,然后循环浏览组的内容 下面是一些重要的代码。用于检索子数据和数据绑定代码的linq:C# Linq-按名称的第一个字母分组,c#,asp.net,linq,C#,Asp.net,Linq,我使用EntityFramework6作为数据源 我已经创建了一个页面,该页面将按供应商名称的第一个字母列出供应商,因此首先我们有所有的“a”,然后是“B”,依此类推 为了做到这一点,我使用了2个ListView对象——它可以很容易地成为一个中继器,但这并不重要 虽然我的供应商名单不多,但我用来获取数据的方法非常昂贵,因为在数据绑定期间我必须调用它27次。我很确定有更好的方法来解决这个问题,但我对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();
}
公共静态IEnumerable StartsWith(字符串首字母)
{
return Select()//Select只返回实体的所有数据
.Where(x=>x.Name.StartsWith(firstLetter,StringComparison.OrdinalIgnoreCase));
}
受保护的无效ListViewAtoZ_ItemDataBound(对象源,ListViewItemEventArgs e)
{
var项目=e.项目;
if(item.ItemType==ListViewItemType.DataItem)
{
var alphanumeric=(字符串)item.DataItem;
var h2=item.GetControl(“HtmlH2”,true);
h2.InnerText=字母数字;
var childView=item.GetControl(“ListViewStartsWith”,true);
childView.DataSource=LenderView.StartsWith(字母数字);
childView.DataBind();
}
}
受保护的void ListViewStartsWith_ItemDataBound(对象源,ListViewItemEventArgs e)
{
var项目=e.项目;
if(item.ItemType==ListViewItemType.DataItem)
{
var供应商=(供应商)项目.DataItem;
var litName=item.GetControl(“LiteralName”,true);
litName.Text=供应商名称;
}
}
void LoadData()
{
var alphanumerics=新字符串[]
{
“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=字母数字;
ListViewAtoZ.DataBind();
}
我认为一定有一种方法可以对数据进行分组,然后循环浏览组的内容
有。
试试下面的方法
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对象。LINQ to entities也应该以同样的方式工作。我是误读了这一点,还是您的一些名字实际上以
“0-9”开头?
?否,您没有误读它-我选择了在此时不将这种复杂情况引入等式中。对于空字符串,您需要一些东西-没有非字符'
。然后我如何选择要绑定到的子组?