Jef*_*eff 12 c# linq generic-list sql-order-by
在我的通用存储库中,我有以下方法:
public virtual IEnumerable<T> GetAll<T>() where T : class
{
using (var ctx = new DataContext())
{
var table = ctx.GetTable<T>().ToList();
return table;
}
}
Run Code Online (Sandbox Code Playgroud)
T是Linq to Sql类,我希望能够在特定属性(即int SortOrder)上使用OrderBy.假如T具有属性名称"SortOrder",则在此属性上执行OrderBy.但我不确定如何实现这一目标.所以我需要一些帮助.谢谢!我觉得动态语言在做这类工作时真的很棒!
虽然编写类型安全的查询对于大多数场景来说都很好,但在某些情况下,您希望能够灵活地动态构建查询
这正是我面临的问题,我想知道这个linq动态助手是否可以制作成官方的.NET库.
public IEnumerable<T> GetAll<T,K>(Expression<Func<T,K>> sortExpr)
{
using (var ctx = new DataContext())
{
ctx.ObjectTrackingEnabled = false;
var table = ctx.GetTable<T>().OrderBy(sortExpr).ToList();
return table;
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
var t = GetAll<Foo, int>(x => x.Bar);
Run Code Online (Sandbox Code Playgroud)
不幸的是,你必须提供密钥的类型.除非你开始搞乱表达式.
除非将type参数约束为T具有要排序的属性的类型,否则不能一般地执行此操作.例如,如果您有一个名为的接口IHaveTheProperty,那么您可以执行以下操作:
public virtual IEnumerable<T> GetAll<T>() where T : class, IHaveTheProperty
{
using (var ctx = new DataContext())
{
ctx.ObjectTrackingEnabled = false;
var table = ctx.GetTable<T>().ToList().AsReadOnly().OrderBy(t=>t.TheProperty);
return table;
}
}
Run Code Online (Sandbox Code Playgroud)
但是没有约束,您只能使用该System.Object类型的方法.
创建了LINQ to SQL类partial.这意味着您可以创建另一个类部件来强制其中一个类实现您的接口:
public partial class Address : IHaveTheProperty
{
}
Run Code Online (Sandbox Code Playgroud)
要使其工作,您需要定义约束.例如:
public interface IOrderable
{
int SortOrder { get; }
}
public virtual IEnumerable<T> GetAll<T>() where T : class, IOrderable
{
...
}
Run Code Online (Sandbox Code Playgroud)
现在您可以ts.OrderBy(t => t.SortOrder)在方法体内部使用.您打算使用此方法的所有类必须实现此接口.
但是,正如您所指出的,LINQ To SQL类不实现此接口.如果使用LINQ to SQL,我建议您不要采用这种方法.使用LINQ to SQL,从表中获取所有对象非常容易,并且可以通过简单的方法来订购这些对象.如果您学会正确使用提供的接口,您的查询也会更快,并且使用更少的内存,因为您让数据库为您进行过滤而不是在客户端上进行过滤.
您可以使用动态 Linq 库,它可以让您动态构建 OrderBy:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-动态查询库.aspx
就我个人而言,我总是让我的存储库返回 IQueryable,然后消费者可以根据需要构建额外的过滤、排序或投影。
| 归档时间: |
|
| 查看次数: |
13973 次 |
| 最近记录: |