似乎可以使用Predicates实现Dapper Extensions中的排序:
Predicates.Sort<Person>(p => p.LastName)
我的问题是,如何在谓词中实现随机排序(即sql中的RAND())?
答案 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中的整个谓词系统也是如此。我认为应该进行大量重构,以允许比普通的基于列的限制更多。