簡體   English   中英

列表<t>實現 IQueryable<t></t></t>

[英]List<T> to implement IQueryable<T>

我正在嘗試為我的IRepository接口創建一個模擬:

public interface IRepository<T> : ICollection<T>, IQueryable<T>
{
}

有了這個實現:

public class RepositoryFake<T> : List<T>, IRepository<T>
{
    public Expression Expression
    {
        get
        {
            return this.AsQueryable().Expression;
        }
    }

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

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

但是當我使用它時,我得到了StackOverflow異常。 如何正確實現此接口以便能夠僅將List用作存儲庫?

用法很簡單

[Test]
public void Test()
{
    RepositoryFake<User> users = new RepositoryFake<User>();
    users.Add(new User());

    List<User> list = (from user in users 
                 where user.Id == "5"
                 select user).ToList();

    Assert.That(list, Is.Empty);
}

這是異常的屏幕截圖:

例外

出現問題的原因是,如果您執行AsQueryable ,它會檢查 object 是否已經實現IQueryable ,如果是則返回它。

使用new EnumerableQuery<T>(this)代替不執行此檢查的AsQueryable


.net 3.5 的解決方法:

return ((IEnumerable<T>)this).Select(x=>x).AsQueryable()

首先轉換為IEnumerable<T>所以選擇的Select方法將是Enumerable.Select not Queryable.Select 身份 select 然后將返回一個新的 object ,它沒有實現IQueryable<T> ,因此檢查它是否在AsQueryable中實現失敗。

嘗試使用base.AsQueryable()而不是this.AsQueryable()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM