Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq-按名称的第一个字母分组_C#_Asp.net_Linq - Fatal编程技术网

C# Linq-按名称的第一个字母分组

C# Linq-按名称的第一个字母分组,c#,asp.net,linq,C#,Asp.net,Linq,我使用EntityFramework6作为数据源 我已经创建了一个页面,该页面将按供应商名称的第一个字母列出供应商,因此首先我们有所有的“a”,然后是“B”,依此类推 为了做到这一点,我使用了2个ListView对象——它可以很容易地成为一个中继器,但这并不重要 虽然我的供应商名单不多,但我用来获取数据的方法非常昂贵,因为在数据绑定期间我必须调用它27次。我很确定有更好的方法来解决这个问题,但我对Linq的了解还不够 我认为一定有一种方法可以对数据进行分组,然后循环浏览组的内容 下面是一些重要的

我使用EntityFramework6作为数据源

我已经创建了一个页面,该页面将按供应商名称的第一个字母列出供应商,因此首先我们有所有的“a”,然后是“B”,依此类推

为了做到这一点,我使用了2个ListView对象——它可以很容易地成为一个中继器,但这并不重要

虽然我的供应商名单不多,但我用来获取数据的方法非常昂贵,因为在数据绑定期间我必须调用它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();
    }
公共静态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”开头?
?否,您没有误读它-我选择了在此时不将这种复杂情况引入等式中。对于空字符串,您需要一些东西-没有非字符
'
。然后我如何选择要绑定到的子组?