LINQ查询 - 如何按顺序排序?

时间:2011-05-26 20:35:28

标签: linq entity-framework silverlight-4.0 sql-order-by

在调试中我得到

  

m_tableContext.TemplateTables.OrderBy(a => a.id)表达式不能包含lambda表达式

private readonly TamplateTableContext m_tableContext = new TamplateTableContext();

m_tableContext.Load(m_tableContext.GetTemplateTableQuery());    

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

如何排序?

3 个答案:

答案 0 :(得分:2)

目前的代码有点难以辨别。下面的示例使用相同的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);
}

您可能实际上来自关键数据类型信息不足的错误。 This讨论可能会对您有所帮助。

<强>更新 啊,它在调试中,就像在调试模式下,而不是DEBUG目标,是吗?!... 如果您试图在快速监视或即时窗口中查看结果 - 这是预期的错误。这并不意味着代码有问题,只是调试器不喜欢lambda表达式。

答案 1 :(得分:1)

您无法在运行时检查Lambda表达式。它们需要编译,甚至在运行时更改包含lambda(不仅仅是lambda本身)的方法需要重新编译。

答案 2 :(得分:0)

如果这是一个方法调用,它就不会工作。 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模式,所以我向你展示的并不是真的在上下文中,因为看起来你实际上可能在后面的代码中完成所有这些...但我真的只是想告诉你如何进行回调。