Linq - 集团的第一个名字

时间:2015-02-04 10:25:02

标签: c# asp.net linq

我使用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();
    }

2 个答案:

答案 0 :(得分:13)

您可以使用以下内容进行分组并获取项目的子列表。

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对象。它对LINQ实体也应该以相同的方式工作。

答案 1 :(得分:1)

  
    

我认为必须有一种方法可以对数据进行分组,然后循环遍历组内容。

  

是的。 尝试类似下面的内容

Select().GroupBy(c=>string.IsNullOrEmpty(c.Name) ? '' : c.Name[0]);

刚添加string.IsNullOrEmpty以确保字符串不为空。