0

似乎 Dapper Extensions 中的排序可以通过 Predicates 来实现:

Predicates.Sort<Person>(p => p.LastName)

我的问题是,如何对谓词实现随机排序(即 sql 中的 RAND())?

4

1 回答 1

2

Predicates.Sort 实际上产生了一个与 ISort 兼容的接口,其定义如下:

public interface ISort
{
    string PropertyName { get; set; }
    bool Ascending { get; set; }
}

看起来我们有机会将属性名称设置为“RAND()”之类的,对吧?...但是,遗憾的是,这个接口是这样使用的:

if (sort != null && sort.Any())
{
    sql.Append(" ORDER BY ")
       .Append(sort.Select(s => GetColumnName(classMap, s.PropertyName, false) + (s.Ascending ? " ASC" : " DESC")).AppendStrings());
}

所以 Dapper Extensions 实际上检查传递的名称是列名。GetColumnName 定义如下:

public virtual string GetColumnName(IClassMapper map, string propertyName, bool includeAlias)
{
    IPropertyMap propertyMap = map.Properties.SingleOrDefault(p => p.Name.Equals(propertyName, StringComparison.InvariantCultureIgnoreCase));
    if (propertyMap == null)
    {
        throw new ArgumentException(string.Format("Could not find '{0}' in Mapping.", propertyName));
    }
    return GetColumnName(map, propertyMap, includeAlias);
}

因此,字符串实际上不应该是列名,而是属性名(他们在 ISort 接口中为字段命名是有目的的,对吧?)。

所以,要实现你想要的东西,你需要自定义他们的 SQL 生成器。

有关更多详细信息,最好的方法是参考来源:

谓词:https ://github.com/tmsmith/Dapper-Extensions/blob/master/DapperExtensions/Predicates.cs

SqlGenerator:https ://github.com/tmsmith/Dapper-Extensions/blob/master/DapperExtensions/Sql/SqlGenerator.cs

PS:由于初学者的代表,我无法发布到repo root的链接,希望你能猜到;)

PPS:Dapper Extensions 中的整个谓词系统也是如此。我相信它应该被极大地重构,以允许更多的基于列的限制。

于 2015-04-01T12:05:29.233 回答