发送一个完整的lambda表达式,包括:where,orderby,take,skip作为参数

时间:2013-07-26 20:32:34

标签: c# asp.net entity-framework design-patterns lambda

我正在编写一个分层的ASP.Net应用程序,它由Bussiness层,Repository层,服务层......组成。在存储库层中,我使用EntityFramework作为ORM。在服务层,我想以lambda格式(包括OrderBy或OrderByDescending,take,skip,...)将查询传递给存储库层,并在DbSet上运行查询并返回结果实体。

<小时/> 简单来说:(我如何在asp.net c#中执行类似以下模拟代码的操作)

    public class Repository
    {
      public List<Book> findby(var query)
      {
        var dbcontext = DataContextFactory.GetDataContext();
        //The following line should do this :  dbcontext.Books.Where(B=>B.New==true && B.Id>99).OrderBy(B=>B.Date).ThenBy(B=>B.Id).Skip(2).Take(10);
        List<Book> matchedBooks = RunQueryOnBooks(dbcontext.Books,query); 
        return matchedBooks;
      }
    }

    public class Service
    {
      public List<Book> getTopNewBooks(Repository _repository)
      {
        var query = Where(B=>B.New==true && B.Id>99).OrderBy(B=>B.Date).ThenBy(B=>B.Id).Skip(2).Take(10);
        List<Book> matchedBooks = _repository.findby(query);
        return matchedBooks;
      }
    }

所以问题是:

  • 我应该使用哪种类型而不是 var 来进行查询(如果有可能的话)
  • 我如何在 dbcontext.Books 上执行查询

请提供一个很好的简单示例,例如我的和更多参考资料。提前谢谢。

4 个答案:

答案 0 :(得分:1)

我想你可能只想要一个Func<IQueryable<Book>, IQueryable<Book>>

void RunQueryOnBooks(DbSet<Book> set, Func<IQueryable<Book>, IQueryable<Book>> query)
{
    return query(set.AsQueryable());
}

query输入可以是lambda:

Repository.FindBy(set => set.Where(B => B.new == true ... ));

答案 1 :(得分:0)

LINQ使用Lambda表达式,可以表示为Funcs。只要您构建一个返回适当类型并采用适当参数类型的Func,您就可以全部设置。

var myFunc = new Func<IEnumerable<Book>, IEnumerable<Book>>(book => book.Where(i => true /* rest of your code here */));
var test = Enumerable.Empty<Book>();
var result = myFunc(test);

答案 2 :(得分:0)

如果您考虑一下,您所说的是您想要收集一些书籍作为输入并回馈一些过滤/订购的书籍。因此,查询的适当类型为Func<IEnumerable<Books>, IEnumerable<Books>

考虑到这一点,我可能会使查询成为一个函数(getTopNewBooks)而不是lambda,但两者都可以。无论哪种方式,您都可以将委托方法传递给findby函数,如:

public class Application
{
  public static void Main()
  {
    var repo = new Repository();
    foreach (var topBook in repo.findby(Service.getTopNewBooks))
    {
      // This is a matching top book
    }
  }
}

public class Repository
{
  public List<Book> findby(Func<IEnumerable<Book>,IEnumerable<Book>> query)
  {
    var dbcontext = DataContextFactory.GetDataContext();
    List<Book> matchedBooks = query(dbcontext.Books).ToList(); 
    return matchedBooks;
  }
}

public class Service
{
  public static IEnumerable<Book> getTopNewBooks(IEnumerable<Book> input)
  {
    return input.Where(B=>B.New==true && B.Id>99).OrderBy(B=>B.Date).ThenBy(B=>B.Id).Skip(2).Take(10);
  }
}

答案 3 :(得分:0)

如果将鼠标悬停在Visual Studio中的“var”上,它将告诉您推断的类型。您可以使用它来显示您的查询最终的类型。