gpt4 book ai didi

c# - 存储库的通用 Linq 查找方法

转载 作者:行者123 更新时间:2023-11-30 16:10:33 27 4
gpt4 key购买 nike

我有一个应用程序使用存储库模式来抽象数据的检索方式。我计划使用 Web 服务来检索数据,但在开发过程中只会模拟它。但是,我一直在研究如何使查找方法起作用。到目前为止,我有以下内容,但我不确定 query.Compile() 是否正确(我没有找到这样做的示例)。我收到一个编译器错误,指出 Linq 的采用 System.Linq.Expressions.Expression 的 Where 方法没有重载。这是我目前所处的位置:

public async Task<IEnumerable<Customer>> FindAsync(Expression<Func<Customer, bool>> query)
{
var allCustomers = await GetAllAsync(true);

return allCustomers.Where(query.Compile());
}

在某些时候,我想弄清楚如何避免检索所有客户然后也应用表达式,但我不确定如何将表达式传递给 REST web 服务以便在数据访问层进行过滤.

最佳答案

我看到的 Repository 模式的实现一般是这样的(使用 Entity Framework):

public class Repository<T> where T : class
{
private readonly DbSet<T> _queryableBase;

public Repository(DbSet<T> queryableBase)
{
_queryableBase = queryableBase;
}

public T Select(IFilter<T> filterClass)
{
return filterClass.Filter(_queryableBase.AsQueryable()).First();
}
public IEnumerable<T> SelectMany(IFilter<T> filterClass)
{
return filterClass.Filter(_queryableBase.AsQueryable());
}

public void Delete(T item)
{
_queryableBase.Remove(item);
}

public void Add(T item)
{
_queryableBase.Add(item);
}
}

然后是过滤对象:

public interface IFilter<T>
{
IEnumerable<T> Filter(IEnumerable<T> queryableBase);
}

示例过滤实现:

class FilterChris : IFilter<ATestObject>
{
public IEnumerable<ATestObject> Filter(IEnumerable<ATestObject> queryableBase)
{
return queryableBase.Where(o => o.FirstName == "Chris");
}
}

public class ATestObject
{
public string FirstName { get; set; }
public string LastName { get; set; }
}

请注意,过滤器可以链接。

关于c# - 存储库的通用 Linq 查找方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25611054/

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