2015-02-04 3 views
4

저는 데이터 소스로 Entity Framework 6을 사용하고 있습니다.Linq - 첫 번째 이름으로 그룹화

공급 업체를 이름의 첫 글자로 나열하는 페이지를 만들었으므로 먼저 'A', 'B'등이 모두 있습니다.

이렇게하려면 두 개의 ListView 객체를 사용합니다. 쉽게 반복기가 될 수 있지만 중요하지는 않습니다.

내 공급 업체 목록이 광범위하지 않지만 필자가 데이터를 가져 오는 데 사용한 방법은 데이터 바인딩 중에 27 번 호출해야한다는 점에서 비용이 많이 듭니다. 나는 이것에 대해 갈 수있는 더 좋은 방법이 있다고 확신하지만, Linq에 관한 나의 길을 충분히 잘 모른다.

데이터를 그룹화 한 다음 그룹의 내용을 반복하는 방법이 있어야한다고 생각합니다.

다음은 중요한 코드 비트입니다. Linq의 자식 데이터와 데이터 바인딩 코드를 retreive합니다 : 나는 데이터를 그룹화하고 그룹의 내용을 통해 반복하는 방법이 있어야한다 생각하고

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

내가 잘못 읽었나요, 아니면 실제로 이름 중 일부가''0 - 9 ''로 시작합니까? – Rawling

+1

아니요, 당신은 그것을 잘못 읽지 않았습니다 - 저는이 시점에서 그 합병증을 방정식에 던지지 않기로했습니다. – dotnetnoob

답변

9

다음을 사용하여 항목의 하위 목록을 그룹화하고 가져올 수 있습니다.

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

.

예 있습니다.

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

그냥 확인 문자열이 null이 할 string.IsNullOrEmpty 추가 다음과 같은 것을 시도 .

+2

null 문자열의 경우 * something *이 필요합니다. - 문자가 아닌 '' '와 같은 것은 없습니다. – Rawling

+1

그러면 어떻게 하위 그룹을 선택하여 바인딩 할 수 있습니까? – dotnetnoob