2010-08-09 13 views
6

Tome un vistazo a mi código aquí:Este método no es compatible en contra de un resultado de consulta materializada

public static ItemType GetItem(int id) 
{ 
    ItemType it = new ItemType(); 
    using (var context = matrix2.matrix2core.DataAccess.Connection.GetContext()) 
    { 
     var q = (from ci in context.Item 
       where ci.ID == id 
       let TemplateID = ci.TemplateID 
       let Groups = from x in context.CriteriaGroup 
           where x.TemplateID == TemplateID 
           select new 
           { 
            x 
           } 
       let CriteriaItems = from x in context.CriteriaItem 
            where Groups.Select(y => y.x.ID).Contains(x.CriteriaGroupID) 
            select new 
            { 
             x 
            } 
       select new 
       { 
        ci.ID, 
        ci.Name, 
        ci.CategoryID, 
        ci.Description, 
        ci.ItemValue, 
        TemplateID, 
        Groups, 
        CriteriaItems, 
        ItemValues = from x in context.ItemValue 
            where x.ItemID == id 
            select new 
            { 
             x, 
             CriteriaID = x.CriteriaItem.Criteria.ID 
            } 
       }).FirstOrDefault(); 

     if (q != null) 
     { 
      it.ID = q.ID; 
      it.CategoryID = q.CategoryID; 
      it.Name = q.Name; 
      it.TemplateID = q.TemplateID; 
      it.Description = q.Description; 
      it.CriteriaGroups = new List<CriteriaGroupType>(); 
      it.CriteriaItems = new List<CriteriaItemType>(); 
      it.ItemValues = new List<ItemValueType>(); 

      foreach (var x in q.ItemValues) 
      { 
       ItemValueType ivt = new ItemValueType(); 
       ivt.CriteriaItemID = x.x.CriteriaItemID; 
       ivt.CriteriaID = x.CriteriaID; 
       ivt.Data = x.x.Data; 
       ivt.ID = x.x.ID; 
       ivt.ItemID = x.x.ItemID; 
       it.ItemValues.Add(ivt); 
      } 

      /////////error when I added the orderby clause 
      foreach (var x in q.Groups.OrderBy(x => x.x.SortOrder)) 
      { 
       CriteriaGroupType cgt = new CriteriaGroupType(); 
       cgt.ID = x.x.ID; 
       cgt.Name = !string.IsNullOrEmpty(x.x.Name) ? x.x.Name : "Group" + x.x.ID; 
       cgt.SortOrder = x.x.SortOrder; 
       cgt.TemplateID = x.x.TemplateID; 
       it.CriteriaGroups.Add(cgt); 
      } 

      /////////error when I added the orderby clause 
      foreach (var temp in q.CriteriaItems.OrderBy(x => x.x.SortOrder)) 
      { 
       CriteriaItemType cit = new CriteriaItemType(); 
       cit.ID = temp.x.ID; 
       cit.CriteriaGroupID = temp.x.CriteriaGroupID; 
       cit.GroupName = (temp.x.Name != null) ? temp.x.Name : "Group" + temp.x.ID; 
       cit.CriteriaID = temp.x.CriteriaID; 
       cit.CriteriaName = temp.x.Criteria.Name; 
       cit.Name = !string.IsNullOrEmpty(temp.x.Name) ? temp.x.Name : temp.x.Criteria.Name; 
       cit.Options = temp.x.Options; 
       it.CriteriaItems.Add(cit); 
      } 
     } 
    } 
    return it; 
} 

lugar de dejar que SQL manejar la clasificación (OrdenarPor) quería asp.net para hacer la clasificación en su lugar. Tomé la clasificación de la consulta SQL linq y la puse en el ciclo foreach. Cuando lo hice, recibí el error. ¿Hay alguna manera de arreglar esto?

Respuesta

5

Usted debe ser capaz de pasar de IQueryable a IEnumerable con un simple

var q2 = q.ToList();

Lo que quería decir, por supuesto, era:

var groups = q.Groups.ToList(); 
+0

sería una penalización de rendimiento para esto? – Luke101

+0

@LUke, consulte Edición con grupos ... Esa nueva lista de distribución() no debería agregar demasiados gastos generales, de todos modos leerá todos los grupos aquí. –

+0

Creo que L2E debería admitir llamar a FirstOrDefault en sub selecciones para mí, eso es equivalente a SELECT TOP 1 ... que ahora es una molestia en L2E pero no en L2S para, p. Ej. – John

0

Tome un vistazo a this link.
Tal vez el consejo hecho por Julie Lerman sea útil en su caso.

Cuestiones relacionadas