【问题标题】:How to Order By Descending with SQLite.NET? OrderByDescending() gives me error: "Order By does not support: xx => Convert(xx).ID"如何使用 SQLite.NET 降序排序? OrderByDescending() 给我错误:“Order By 不支持:xx => Convert(xx).ID”
【发布时间】:2013-06-14 08:37:06
【问题描述】:

我正在尝试实现一种方法来检索表中的所有行,按 ID 降序排序。

这是代码:

    public IEnumerable<T> GetItemsDescending<T>() where T : IBusinessEntity, new()
    {
        lock (locker) 
        {
            return Table<T>().Select(i => i).OrderByDescending(xx => xx.ID).ToList();
        }
    }

看起来应该可以工作,但是我收到了一个我不明白的错误:

        "Order By does not support: xx => Convert(xx).ID"

来自以下 SQLite 方法:

private TableQuery<T> AddOrderBy<U>(Expression<Func<T, U>> orderExpr, bool asc)
{
    if (orderExpr.NodeType == ExpressionType.Lambda)
    {
        var lambda = (LambdaExpression)orderExpr;

        MemberExpression mem = null;

        var unary = lambda.Body as UnaryExpression;
        if (unary != null && unary.NodeType == ExpressionType.Convert)
        {
            mem = unary.Operand as MemberExpression;
        }
        else
        {
            mem = lambda.Body as MemberExpression;
        }

        if (mem != null && (mem.Expression.NodeType == ExpressionType.Parameter))
        {
            var q = Clone<T>();
            if (q._orderBys == null)
            {
                q._orderBys = new List<Ordering>();
            }
            q._orderBys.Add(new Ordering
            {
                ColumnName = Table.FindColumnWithPropertyName(mem.Member.Name).Name,
                Ascending = asc
            });
            return q;
        }
        else
        {
            throw new NotSupportedException("Order By does not support: " + orderExpr);
        }
    }
    else
    {
        throw new NotSupportedException("Must be a predicate");
    }
}

应要求PanelLog 类:

public class PanelLog : IBusinessEntity
{
    public PanelLog()
    {

    }

    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }

    public uint Sequence { get; set; }
    public DateTime Time { get; set; }
    public string Message { get; set; }
    public bool Alarm { get; set; }
}

【问题讨论】:

    标签: sqlite xamarin.ios xamarin.android


    【解决方案1】:

    没有答案?

    好的,这就是我正在做的工作:

    public static IEnumerable<PanelLog> GetPanelLogsDescendingSql(params object[] args)
    {
        return me.db.Query<PanelLog>("select * from PanelLog ORDER BY ID DESC");        
    }
    

    【讨论】:

    • ID的字段类型是什么?你能发布你的 PanelLog 课程吗?
    • 抱歉,鉴于您提供的代码,我无法复制您报告的问题。你碰巧有一个完整的样本可以复制这个问题吗?
    • TaskyPro 示例,可在此处获得:github.com/xamarin/mobile-samples/tree/master/TaskyPro 在结构上与我正在做的非常相似。如果您将 TaskDatabase 类中的 return (from i in Table&lt;T&gt; () select i).ToList (); 行更改为 return (Table&lt;T&gt;().OrderByDescending(i =&gt; i.ID).Select(i =&gt; i)).ToList();,则会导致相同的错误。
    • 抱歉耽搁了,我已经下载了 TaskyPro 并进行了更改(在 TaskDatabase.GetItems 中),它对我有用。我目前正在运行 alpha - iOS v6.3.6.76。
    • (在模拟器和设备以及安卓模拟器中运行良好)
    【解决方案2】:
    return Table<T>().Select(i => i).OrderByDescending(xx => xx.ID).ToList();
    

    return me.db.Query<PanelLog>("select * from PanelLog ORDER BY ID DESC");
    

    为我工作。

    【讨论】:

      猜你喜欢
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2015-11-05
      • 1970-01-01
      • 2020-04-05
      • 2014-03-30
      相关资源
      最近更新 更多