gpt4 book ai didi

c# - 有没有办法在没有数据源的情况下将 LINQ 查询创建为变量(尚未)?

转载 作者:太空狗 更新时间:2023-10-29 22:23:55 31 4
gpt4 key购买 nike

前言:
我的核心问题与这个非常相似:How can I write a clean Repository without exposing IQueryable to the rest of my application?这一直没有得到答复。我希望如果我以不同的方式处理问题,并提出稍微不同的问题,我可能会得到结果。我将重复这个其他问题中的一些内容,以避免要求读者阅读它以了解上下文。

问题:
我正在使用 POCO 实体和 Entity Framework 4。我正在尝试允许在应用程序层对实体集进行复杂的临时过滤,同时尝试避免暴露 IQueryable<T>超过我的存储库边界。这给我留下了一些麻烦。

  • 我不想在需要大量参数的存储库上创建单一的大量过滤器方法,例如:

    IEnumerable GetFilteredCustomers(string nameFilter, string addressFilter, bool isActive, int customerId, ...)

    这不仅使用起来非常麻烦,而且看起来非常难看,尤其是如果它主要是一堆空值等。它也不像我希望的那样易于维护。

  • 我不想在存储库上创建大量过滤方法,例如:

    IEnumerable GetActiveCustomers()
    IEnumerable GetCustomersByName()

    这种方法存在许多问题,包括需要大量的方法列表,该列表会增长到 n!。如果我希望能够以任意方式组合它们,其中 n 是可用过滤条件的数量。 (即所有名为 George 的活跃客户)。也很难维护。

  • 我不想创建可操作 IEnumerable<T> 的链式方法(Fluent Interface) ,因为最终这涉及从数据库中取回大量结果集并在内存中对其进行过滤,这不是可扩展的解决方案。

  • 我无法创建可操纵 IQueryable<T> 的 Fluent Interface因为正如我已经说过的,我不想公开 IQueryable<T>通过存储库。

  • 我想避免通过传入一个充满参数的对象而不是一个大的参数列表来简单地重新散列单一的大量过滤器方法,尽管在这一点上这可能是最不丑陋的解决方案。

想法:
最终,我认为理想的解决方案是找到某种方法来创建不知道来源的完整查询,并将其存储为参数。然后我可以将其传递到源已知的存储库中,并将查询应用于源并返回结果。

澄清;与上面提到的简单地创建参数对象相反,我想使用原始 LINQ 查询,但以某种方式将它们存储在变量中,稍后将它们应用于数据源。我怀疑必须提前知道返回类型,但我完全可以定义它并提前知道它。

要从另一个角度来看它,请考虑以下几点:

IQueryable<Customer> filteredCustomers = customerRepository.GetAll()
.Where(c => c.FirstName == "Dave")
.Where(c => c.IsActive == true)
.Where(c => c.HasAddress == true)
;

我想将三个 Where 子句打包为一个查询对象,与 customerRepository.GetAll() 完全分开,将其作为参数传递并稍后应用。

最佳答案

当然。您可以编写如下方法:

public Expression<Func<Customer, bool>> GetDave()
{
return c => c.FirstName == "Dave"
&& c.IsActive
&& c.HasAddress;
}

...和存储库方法,例如:

public IEnumerable<Customer> GetOneGuy(Expression<Func<Customer, bool>> criteria)
{
return Context.Customers.Where(criteria);
}

...然后调用:

var dave = Repository.GetOneGuy(this.GetDave()).Single();

关于c# - 有没有办法在没有数据源的情况下将 LINQ 查询创建为变量(尚未)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8683391/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com