2010-08-09 1 views
6

Посмотрите на мой код здесь:Этот метод не поддерживается против материализованного результата запроса

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; 
} 

Вместо того, чтобы позволить SQL обрабатывать сортировкой (OrderBy) Я хотел asp.net, чтобы сделать сортировку вместо этого. Я взял сортировку из запроса SQL linq и поместил его в цикл foreach. Когда я это сделал, я получил ошибку. Есть ли способ исправить это?

ответ

5

Вы должны быть в состоянии перейти от IQueryable к IEnumerable с простой

var q2 = q.ToList();

То, что я имел в виду, конечно, был:

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

будет ли это наказанием за это? – Luke101

+0

@LUke, см. Раздел «Редактирование с помощью групп ...». В новый ToList() не должно быть много лишних накладных расходов, вы все равно прочтете все группы. –

+0

Я думаю, что L2E должен поддерживать вызов FirstOrDefault на sub selects to me, эквивалентный SELECT TOP 1 ... который теперь представляет собой проблему в L2E, но не в L2S, например. – John

0

Взгляните на this link.
Возможно, совет, сделанный Джули Лерман, будет полезен в вашем случае.