2015-11-19 49 views
2

我想從一個下拉列表中選擇一個值,但該值可以是一個DateTime或一個字符串,我只想提供一種情況。你有什麼想法做到這一點?Linq動態分組

我的代碼:

public class Personne 
{ 
    public String _NOM { get; set; } 
    public DateTime _DDN { get; set; } 
    public String _VILLE { get; set; } 

    public Personne(String nom, DateTime ddn, String ville) 
    { 
     this._NOM = nom; 
     this._DDN = ddn; 
     this._VILLE = ville; 
    } 
} 

這裏是ButtonClick事件:

List<Personne> _liste = new List<Personne>(); 
_liste.Add(new Personne("toto", new DateTime(1993, 3, 23), "Paris")); 
_liste.Add(new Personne("tata", new DateTime(1993, 3, 23), "New-York")); 
_liste.Add(new Personne("titi", new DateTime(1987, 2, 10), "Paris")); 

var qry = _liste.AsQueryable().OrderBy(listeCritere.SelectedValue) 
    .GroupBy(listeCritere.SelectedValue, "It", null); 

if (listeCritere.SelectedValue == "_DDN") 
{ 
    foreach (IGrouping<DateTime, Personne> item in qry) 
    { 
     Response.Write(item.Key + "<br/>"); 

     foreach (Personne p in item) 
     { 
      Response.Write("&nbsp;&nbsp;&nbsp;&nbsp; Nom complet : " + p._NOM + "<br/>"); 
     } 
    } 
} 
else 
{ 
    foreach (IGrouping<String, Personne> item in qry) 
    { 
     Response.Write(item.Key + "<br/>"); 

     foreach (Personne p in item) 
     { 
      Response.Write("&nbsp;&nbsp;&nbsp;&nbsp; Nom complet : " + p._NOM + "<br/>"); 
     } 
    } 
} 
+0

你沒有表現的可能值' listeCritere.SelectedValue',所以很難理解你想要做什麼。請給出更好的規範或提供所有的源代碼。 – Hogan

+0

@Hogan'SelectedValue'可以是'_NOM','_DDN'或'_VILLE',並決定在動態Linq查詢中查詢哪個屬性。 – poke

+0

或英文 - 姓名,日期,城市......有了它。 – Hogan

回答

1

你可以只在IEnumerable<Personne>環代替,然後得到正確類型的循環中的關鍵:

var qry = _liste.AsQueryable().OrderBy(listeCritere.SelectedValue) 
    .GroupBy(listeCritere.SelectedValue, "It", null); 

foreach (IEnumerable<Personne> item in qry) 
{ 
    if (item is IGrouping<DateTime, Personne>) 
     Response.Write(((IGrouping<DateTime, Personne>)item).Key + "<br/>"); 
    else if (item is IGrouping<object, Personne>) 
     Response.Write(((IGrouping<object, Personne>)item).Key + "<br/>"); 

    foreach (Personne p in item) 
    { 
     Response.Write("&nbsp;&nbsp;&nbsp;&nbsp; Nom complet : " + p._NOM + "<br/>"); 
    } 
} 

您也可以將循環移動到一個通用函數:

public void ButtonClickHandler(object sender, EventArgs e) 
{ 
    var qry = _liste.AsQueryable().OrderBy(listeCritere.SelectedValue) 
     .GroupBy(listeCritere.SelectedValue, "It", null); 

    if (listeCritere.SelectedValue == "_DDN") 
     WritePersonneResponse<DateTime>(Response, qry); 
    else 
     WritePersonneResponse<string>(Response, qry); 
} 

public void WritePersonneResponse<T>(HttpResponse response, IQueryable qry) 
{ 
    foreach (IGrouping<T, Personne> item in qry) 
    { 
     response.Write(item.Key + "<br/>"); 

     foreach (Personne p in item) 
     { 
      response.Write("&nbsp;&nbsp;&nbsp;&nbsp; Nom complet : " + p._NOM + "<br/>"); 
     } 
    } 
} 
+0

它的工作原理!許多thx。 –

1

在LINQ可以在封閉令的功能 - 在這裏我們只是做一個函數返回的鍵值(但總是爲字符串):

string gby = "NOM"; 
//string gby = "DDN"; 
//string gby = "VILLE"; 

var qry = _liste 
      .GroupBy(x => { 
       string result = ""; 
       switch (gby) 

       { 
        case "NOM": result = x._NOM; break; 
        case "DDN" : result = x._DDN.ToString(); break; 
        case "VILLE" : result = x._VILLE ; break; 
       } 
       return result; 
      } 
      ).ToList();