Zol*_*yak 4 c# linq lambda entity-framework
我想知道 LINQ OrderBy 是如何编写的?我尝试重现:
IOrderedQueryable<T> MyOrderBy<T,TKey>(IQueryable<T> qry, Expression<Func<T,TKey> expr)
{
return qry.OrderBy(expr);
}
Run Code Online (Sandbox Code Playgroud)
可以称为:
MyOrderBy<Products,String>(qry, p=>p.Name);
Run Code Online (Sandbox Code Playgroud)
将其重构为 IQueryable 的扩展方法,可以这样调用:
qry.MyOrderBy<String>(p => p.Name );
Run Code Online (Sandbox Code Playgroud)
这与 LINQ OrderBy 不同,LINQ OrderBy 不需要 String 类型参数。在我的版本中如何避免这种情况?
ps:Object 不是替代方案,因为它不适用于 Int32 和其他值类型字段(以及 EF Linq):
IOrderedQueryable<T> MyOrderByObject<T>(IQueryable<T> qry, Expression<Func<T,Object> expr)
{
return qry.OrderBy(expr);
}
Run Code Online (Sandbox Code Playgroud)
将抛出异常(如果 ID 是 Int32 字段):
qry.MyOrderByObject(p => p.ID ); // throws an exception
Run Code Online (Sandbox Code Playgroud)
您可以在方法的通用使用中删除多余的类型参数。
在这种情况下,删除“String”类型是正确的继续,Name属性(字符串)的类型被编译器识别,不需要指定它;
编辑:
public static class MyExtentions
{
public static IOrderedQueryable<T> MyOrderBy<T, TKey>(this IQueryable<T> qry, Expression<Func<T, TKey>> expr)
{
return qry.OrderBy(expr);
}
}
Run Code Online (Sandbox Code Playgroud)
称呼:
qry.MyOrderBy(p => p.Id)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3554 次 |
| 最近记录: |