我正在编写一个分层的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;
}
}
所以问题是:
请提供一个很好的简单示例,例如我的和更多参考资料。提前谢谢。
答案 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”上,它将告诉您推断的类型。您可以使用它来显示您的查询最终的类型。