簡體   English   中英

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

您可以使用以下內容進行分組並獲取項目的子列表。

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實體也應該以相同的方式工作。

我認為必須有一種方法來分組數據,然后循環遍歷組的內容。

是的,有。 嘗試以下內容

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

剛添加string.IsNullOrEmpty以確保字符串不為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM