2011-02-16 15 views
6

Creo que esa es la terminología correcta ...¿Es posible enlazar datos usando un tipo anónimo?

Básicamente, tengo un control de repetidor y una consulta de Linq que recupera algunos elementos. Por lo general, me gustaría acceder directamente a la consulta y usar Eval para completar la plantilla con los resultados.

Sin embargo, no aparece en el formato correcto, por ejemplo, si EndDate es nulo (¿es DateTime?), Entonces quiero sustituirlo por "Present". Estoy usando solo un par de las propiedades en los objetos de resultados de la consulta.

Me pregunto si hay una solución como:

[pseudo madeup code] 
var query = getResults(); 

List<anonymous> anonList = new List(); 

foreach (var q in query) 
{ 
    string myEndDate = ""; 
    if (q.EndDate.HasValue) 
     { myEndDate = q.EndDate.ToString(); } 
    else 
     { myEndDate = "Present"; } 

    anonList.items.add(new { name=q.name, enddate=myEndDate }; 
} 

repeater.Datasource = anonList; 

continuación

<div><%#Eval("enddate")%></div> 

Respuesta

2

Tiene dos o

  1. Utilice un no genérico ArrayList, o
  2. Uso Enumerable.Repeat, es decir: OPCIONES para declarar que el listado de resultados. var anonList = Enumerable.Repeat(new { name="", enddate=""}, 0).ToList();
1

Sí, puede se unen contra los tipos anónimos, pero su código para generar la secuencia de esos tipos tendrá para cambiar un poco:

repeater.DataSource 
    = getResults() 
     .Select(q => new { 
      name = q.name, 
      enddate = (q.EndDate.HasValue) 
         ? q.EndDate.ToString() 
         : "Present" 
     }); 
+0

¿Hay alguna manera de hacerlo sin toda esa lógica de ser en línea? Puede hacerlo bastante ilegible, especialmente si está combinando dos cadenas que pueden ser nulas, por ejemplo 'fullname = q.user.title + q.user.firstname + q.user.lastname;' si el usuario es nulo, fallará , y hacer tres controles en línea además de combinarlos en una sola variable es bastante horrible. – NibblyPig

1

Usted podría tomar la muestra Andrews:

repeater.DataSource = getResults() 
    .Select(q => new { 
     name = q.name, 
     enddate = (q.EndDate.HasValue) 
        ? q.EndDate.ToString() 
        : "Present"  }); 

pero en lugar de calcular la línea enddate, se llama a una función:

repeater.DataSource = getResults() 
    .Select(q => new { 
     name = q.name, 
     enddate = GetEndDate(q)}); 


    private void GetEndDate(TypeOfQ q) 
    { 
     return (q.EndDate.HasValue) ? q.EndDate.ToString() : "Present"; 
    } 

es eso lo que usted ción ??

respecto, Chris

Cuestiones relacionadas