当前位置:  开发笔记 > 数据库 > 正文

使用IQueryable <T>的设计模式

如何解决《使用IQueryable<T>的设计模式》经验,为你挑选了2个好方法。

随着.NET 3.5和IQueryable界面的引入,将出现新的模式.虽然我已经看到了规范模式的许多实现,但我还没有看到使用这种技术的许多其他模式.Rob Conery的Storefront应用程序是另一个使用IQueryable它可能导致一些新模式的具体示例.

有用的IQueryable界面出现了什么样的模式?



1> Fredrik Kals..:

它确实使得存储库模式也更容易实现.您基本上可以创建一个通用存储库:

public class LinqToSqlRepository : IRepository
{
   private readonly DataContext _context;

   public LinqToSqlRepository(DataContext context)
   {
       _context = context;
   }

   public IQueryable Find()
   {
       return _dataContext.GetTable(); // linq 2 sql
   }

   /** snip: Insert, Update etc.. **/
}

然后将它与linq一起使用:

var query = from customers in _repository.Find() 
            select customers;



2> BC...:

我喜欢存储库过滤器模式.它允许您在不牺牲性能的情况下将问题从中间层和数据端层分离出来.

您的数据层可以专注于简单的list-get-save样式操作,而您的中间层可以利用IQueryable的扩展来提供更强大的功能:

存储库(数据层):

public class ThingRepository : IThingRepository
{
    public IQueryable GetThings()
    {
        return from m in context.Things
               select m; // Really simple!
    }
}

过滤(服务层):

public static class ServiceExtensions
{
    public static IQueryable ForUserID(this IQueryable qry, int userID)
    {
        return from a in qry
               where a.UserID == userID
               select a;
    }
}

服务:

public GetThingsForUserID(int userID)
{
    return repository.GetThings().ForUserID(userID);
}

这是一个简单的示例,但可以安全地组合过滤器以构建更复杂的查询.保存性能是因为在将所有过滤器内置到查询中之前,列表未实现.

我喜欢它,因为我不喜欢特定于应用程序的存储库!

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有