LINQ Query - как заказать? - PullRequest
2 голосов
/ 27 мая 2011

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

m_tableContext.TemplateTables.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);

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

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

это немного сложно определить по текущему коду. В приведенном ниже примере используется то же выражение 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, не так ли?! ... Если вы пытаетесь увидеть результат в быстром просмотре или в непосредственном окне - это ожидаемая ошибка. Это не означает, что с кодом что-то не так, просто отладчику не нравятся лямбда-выражения.

1 голос
/ 27 мая 2011

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

0 голосов
/ 28 мая 2011

если это один вызов метода, он не будет работать. Вызовы 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, так что то, что я показываю вам, на самом деле не в контексте, потому что похоже, что вы на самом деле делаете все это в коде позади ... но я просто пытался показать вам, как сделать обратный вызов.

...