#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()); — ошибка…