2012-03-10 11 views
6

Tengo una lista de usuarios, cada usuario tiene una lista de preguntas. En mi modelo, la lista de preguntas debe estar en cadena a través de una coma. Trato:LINQ, no se puede unir a la cadena

public List<ITW2012Mobile.ViewModels.AdminSurveyReportModel> SurveyReportList() 
{ 
    var q = from i in _dbContext.Users 
      where i.UserId != null 
      select new ITW2012Mobile.ViewModels.AdminSurveyReportModel() 
      { 
       FirstName = i.FirstName, 
       LastName = i.LastName, 
       Question4 = String.Join(", " , (from a in _dbContext.MultipleQuestions where a.MultipleQuestionType.KEY == MultipleQuestionKeys.BENEFITS select a.Question).ToArray()) 
      }; 
    return q.ToList(); 
} 

public class AdminSurveyReportModel 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Question4 { get; set; } 
} 

por supuesto, me sale error:

LINQ to Entities does not recognize the method 'System.String Join(System.String, System.String[])' method, and this method cannot be translated into a store expression.

Como llegar correctamente?

+2

en lugar de unirse en 'linq', simplemente devolver la colección y hacer la unión después de la recuperación –

Respuesta

14

Yo sugeriría hacer la operación string.Join localmente en lugar de utilizar AsEnumerable:

var q = from i in _dbContext.Users 
     where i.UserId != null 
     select new 
     { 
      FirstName = i.FirstName, 
      LastName = i.LastName, 
      Question4Parts = _dbContext.MultipleQuestions 
             .Where(a => a.MultipleQuestionType.KEY == 
                MultipleQuestionKeys.BENEFITS) 
             .Select(a => a.Question) 
     }; 

return q.AsEnumerable() 
     .Select(x => new ITW2012Mobile.ViewModels.AdminSurveyReportModel 
        { 
         FirstName = x.FirstName, 
         LastName = x.LastName, 
         Question4 = string.Join(", ", x.Question4Parts) 
        }) 
     .ToList(); 
+0

Pregunta 4 es de tipo String, su sentense con selecto tiene tipo IQuerable ... – John

+1

@ John: Eso está bien - porque en' q' Solo estoy creando un 'IQueryable ' para un tipo anónimo 'T'. Solo lo convierto en un 'AdminSurveyReportModel' en la segunda parte. Cambiaré el nombre de la propiedad para que quede más claro. –

+0

oh, lo perdí. ¡Muchas gracias! – John

-3

Trate de usar el método Aggregate.

Question4 = (from a in _dbContext.MultipleQuestions where a.MultipleQuestionType.KEY == MultipleQuestionKeys.BENEFITS select a.Question).ToArray().Aggregate((x,y) => x + "," + y) 

no hemos probado

+0

no, no funciona: LINQ to Entities no reconoce el método 'System.String Aggregate [String] (System.Collections.Generic.IEnumerable'1 [System.String], System.Func'3 [System.String, System.String, System.String]) ', y este método no se puede traducir a una expresión de tienda. – John

0

no puede incluir la string.join() en la proyección inicial, porque el traductor LINQ no lo soporta. ¿Puedo escribir un traductor personalizado para eso?

Cuestiones relacionadas