2015-11-19 2 views
2

Я хотел бы сделать группу значением, выбранным из раскрывающегося списка, но значение может быть DateTime или String, и я хочу предоставить только один случай. У вас есть идея сделать это?Группа с Linq Dynamic

Мой код:

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