Запрос LINQ — в каком порядке?

#linq #entity-framework #silverlight-4.0 #sql-order-by

#linq ( ссылка ) #сущность-фреймворк #silverlight-4.0 #sql-порядок-по #linq #entity-framework #sql-order-by

Вопрос:

При отладке я получаю

m_tableContext.Таблицы шаблонов.OrderBy(a => a.id ) Выражение не может содержать лямбда-выражения

 private readonly TamplateTableContext m_tableContext = new TamplateTableContext();

m_tableContext.Load(m_tableContext.GetTemplateTableQuery());    

lbTemplateTable.DataContext = m_tableContext.TemplateTables.OrderBy(a => a.id);
  

Как выполнить сортировку?

Комментарии:

1. Какой параметр ожидает OrderBy()?

2. Мне нужна сортировка по идентификатору (4,3,2,1)

Ответ №1:

это немного сложно определить по текущему коду. Приведенный ниже пример использует то же выражение OrderBy, и оно компилируется и выполняется нормально.

 public class A { public int ID; }

public static void Test()
{
    List<A> listA = new List<A> {new A {ID=7}, new A {ID=2}, new A {ID=16}};

    var query1 = from x in listA orderby x.ID select x;
    var query2 = (from x in listA select x).OrderBy(a => a.ID);

    foreach(var x1 in query1) Console.WriteLine("{0}", x1.ID);
    foreach(var x2 in query2) Console.WriteLine("{0}", x2.ID);
}
  

Ошибка, с которой вы столкнулись, на самом деле может возникнуть из-за недостаточной информации о ключевом типе данных. Это обсуждение может помочь вам с этим.

Обновить:Ах, это в режиме отладки, как в режиме отладки, а не DEBUG target, не так ли ?!… Если вы пытаетесь просмотреть результат в быстром просмотре или немедленном окне — это ожидаемая ошибка. Это не означает, что с кодом что-то не так, просто отладчику не нравятся лямбда-выражения.

Комментарии:

1. DK, спасибо, но мне это не помогло. Я плохо читаю пишу на английском. по этому поводу я не могу понять смысл обсуждения. И ваш пример не помог.

2. @simply denis, этот пример просто для проверки того, что ваш синтаксис OrderBy() в порядке. Следующий вопрос заключается в том, что задает Дэвешоу: каков параметр в вашем OrderBy и может ли компилятор определить тип a.id ?

Ответ №2:

Вы не можете проверять лямбда-выражения во время выполнения. Их необходимо скомпилировать, даже изменение метода, содержащего лямбда-выражение (а не только самого лямбда-выражения) во время выполнения, требует перекомпиляции.

Ответ №3:

если это вызов одного метода, он не будет работать. Вызовы Silverlight являются асинхронными, вы должны предоставить обратный вызов для метода Load, чтобы по завершении он выполнял сброс к новому методу….

 private readonly TamplateTableContext m_tableContext = new TamplateTableContext();

m_tableContext.Load(m_tableContext.GetTemplateTableQuery(),onLoadOperationCompleted);    


public void onLoadOperationCompleted(LoadOperation<TemplateTable> lo)
        {
            if (!lo.HasError)
            {
               lbTemplateTable.DataContext = 
                  new ObservableCollection<TemplateTable>(lo.Entities.OrderBy(a => a.id));
            }
}
  

Это надуманный пример. Я использую MVVMLight и шаблон ServiceLocator, поэтому то, что я показываю вам, на самом деле не соответствует контексту, потому что похоже, что вы на самом деле делаете все это в коде … но на самом деле я просто пытался показать вам, как выполнить обратный вызов.

Комментарии:

1. RoomsContext.Load(RoomsContext.GetTableQuery(), LoadBehavior. MergeIntoCurrent, onLoadOperationCompleted, new object()); — ошибка…