-
Notifications
You must be signed in to change notification settings - Fork 856
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
能否为ISelect提供OrderBy(string propertyName)的支持 #197
Comments
这个和 OrderBy(string sql, object parms = null) 有什么区别 OrderBy(“属性”) |
能不能让封装的 interface ISelectTableInfoInfoAccessor
{
IReadOnlyList<SelectTableInfo> SelectTbInfos {get;}
}
class Select0Provider<> : ISelectTableInfoInfoAccessor
{
protected List<SelectTableInfo> _tables = new List<SelectTableInfo>();
// 想要隐藏的话可以显式实现
IReadOnlyList<SelectTableInfo> ITableInfoInfoAccessor.SelectTbInfos {get => _tables; }
} 然后就可以方便地写扩展方法了 public static ISelect<T> OrderByProps<T>(this ISelect<T> select,
Dictionary<string, bool> sorts) where T : class
{
var tableInfo = (select as ITableInfoInfoAccessor).SelectTbInfos[0].Table;
......
} |
IReadOnlyList 提示不支持 4.0,我们的默认要考虑 4.0 支持。 可以用下面的反射获取: var tbs = select.GetType().GetField("_tables",
BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(select) as List<SelectTableInfo>; |
好的,问一下,我看 EfCore源码里很少用internal的,基本都是用 接口的显示实现来隐藏方法和属性的。反射调用和接口的显示实现,哪个效率更高呢? |
用接口的快,反射慢80倍左右。 个人不喜欢定义过多的接口,除非是常用的。人力有限,见谅。 |
OrderBy(string sql, object parms = null) |
是的,简单字段排序可以判断,order by count(xx) 类似这种表达式就不好判断了。所以我选择了让使用者自己判断,判方法:fsql.CodeFisrt.GetTableByEntity(typeof(实体类)).ColumnsByCs 这个是字典类型,对应实体的属性。 |
需要为order by做一个通用封装,传入属性名称,自动生成 order by sql语句。
尝试为
ISelect<>
写扩展方法,但因为需要一个 属性名-->字段名 的映射,所以需要CodeFirst.GetTableByEntity(XXX)获取TableInfo后,再获取到字段名,然后通过
OrderBy(string sql, object parms = null)
来处理。但不把ICodeFirst做成静态的话,每次都要先获取TableInfo,
然后调用 OrderByProp(string propName, TableInfo tableInfo),还是有点冗余,
如果FreeSql能直接提供相应的支持,就方便多了。
The text was updated successfully, but these errors were encountered: