gpt4 book ai didi

linq - 如何将 IQueryable 对象创建的表达式的执行转移到 IEnumerable?

转载 作者:行者123 更新时间:2023-12-02 14:17:57 25 4
gpt4 key购买 nike

在我的代码中,我想让我的存储库可查询。这样,选择的标准将是一个 linq 表达式树。

现在,如果我想在理论上模拟我的存储库,这非常简单:只需实现我的存储库的接口(interface)(这也是一个 IQueryable 对象)。

我的模拟存储库实现只是内存中集合,但我的问题是:您知道一种简单的方法来实现我的模拟的 IQueryable 接口(interface),将查询传输到我的内存中集合 (IEnumerable) 吗?

感谢您的回复,

一定的精度

我的存储库的客户端对象将以这种方式使用我的存储库:

var result = 来自MyRepository 中的条目,其中entry.Product == "SomeProduct"选择条目;

ToList 或 AsEnumerable 的作用是执行查询并将结果作为 List 或 IEnumerable 返回。但我必须在我的存储库上实现 IQueryable 接口(interface),并使用 IQueryProvider 来转换对 IEnumerable 对象的调用中的表达式。

解决方案

该解决方案的实现是将对 IQueryable 的调用委托(delegate)给使用 AsQueryable 的内存集合。

public class MockRepository : IQueryable<DomainObject>
{
private List<DomainObject> inMemoryList = new List<DomainObject>();

#region IEnumerable<DomainObject> Members

public IEnumerator<DomainObject> GetEnumerator()
{
return inMemoryList.GetEnumerator();
}

#endregion

#region IEnumerable Members

IEnumerator IEnumerable.GetEnumerator()
{
return inMemoryList.GetEnumerator();
}

#endregion

#region IQueryable Members

public Type ElementType
{
get
{
return inMemoryList.AsQueryable().ElementType;
}
}

public Expression Expression
{
get
{
return inMemoryList.AsQueryable().Expression;
}
}

public IQueryProvider Provider
{
get
{
return inMemoryList.AsQueryable().Provider;
}
}

#endregion
}

最佳答案

使用AsQueryable在你的 mock 上。现在它们是可查询的,您可以像对待任何其他可查询一样对待它们。

关于linq - 如何将 IQueryable 对象创建的表达式的执行转移到 IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/503208/

25 4 0