使用Dapper Extensions,我如何随机排序?

时间:2014-11-04 19:18:29

标签: predicate dapper-extensions

似乎可以使用Predicates实现Dapper Extensions中的排序:

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

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

1 个答案:

答案 0 :(得分: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中的整个谓词系统也是如此。我认为应该进行大量重构,以允许比普通的基于列的限制更多。