【问题标题】:LINQ Query - how order by?LINQ 查询 - 如何排序?
【发布时间】:2011-05-26 20:35:27
【问题描述】:

在调试中我得到了

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

如何排序?

【问题讨论】:

  • OrderBy() 期望什么参数?
  • 我需要从 ID (4,3,2,1) 排序

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


【解决方案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);
}

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

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

【讨论】:

  • DK,谢谢,但这对我没有帮助。我不好读\写英文。对此我无法理解讨论的意思。你的例子没有帮助。
  • @simply denis,该示例只是为了验证您的 OrderBy() 语法是否正常。下一个问题是 DaveShaw 的问题:您的 OrderBy 中的参数是什么,编译器是否可以判断 a.id 的类型?
【解决方案2】:

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

【讨论】:

    【解决方案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 模式,所以我向您展示的内容并不是真正的上下文,因为看起来您实际上可能是在后面的代码中完成这一切......但我真的只是想向您展示如何进行回调。

    【讨论】:

    • RoomsContext.Load(RoomsContext.GetTableQuery(), LoadBehavior.MergeIntoCurrent, onLoadOperationCompleted, new object()); - 是错误...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多