2

我正在编写一个分层的 ASP.Net 应用程序,它由业务层、存储库层、服务层...组成。在存储库层中,我使用 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

4 回答 4

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 ... ));
于 2013-07-26T20:43:36.060 回答
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);
于 2013-07-26T20:42:57.100 回答
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);
  }
}
于 2013-07-26T20:43:28.913 回答
0

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

于 2013-07-26T21:18:11.997 回答