簡體   English   中英

EF兩次擊中數據庫..我在做什么錯?

[英]EF hitting the database twice.. what am i doing wrong?

我有以下代碼:

    private static List<ProxyServer> proxyServers = new List<ProxyServer>();

    private static IEnumerable<Product> products = new List<Product>();

    private static CharonTestEntities3 context = new CharonTestEntities3();
    public Scrape()
    {

        proxyServers = context.ProxyServers.ToList();
        products = context.Products;
    }

    private ProxyServer getProxy(int countryID)
    {
        //TODO: random proxy based on last usage (< 40 seconds)
        return proxyServers.FirstOrDefault();


    }
    private bool getProducts(string asin)
    {
        var product = products.First(x => x.Asin == asin);

        if (products.First().ProductID > 0)
        {
            return true;
        }

        return false;

    }
    public void DoScrape(SearchCriteria criteria)
    {

        getProducts("A1234543345");
    }

當我運行getProducts(); 它命中數據庫以查找產品,但是我認為它將使用我的產品列表<> ..誰能解釋為什么我最初的scrape = new Scrape()不會將產品列表緩存到產品對象?

因為代碼products = context.Products; 不是列表,而是可查詢對象。 如果將代碼更改為products = context.Products.ToList(); 它將一次查詢SQL所有數據。

而且products.First(x => x.Asin == asin)products.First(x => x.Asin == asin) products.First()完全不同,因此您沒有緩存,但是可查詢的對象使數據庫兩次命中

您的產品列表的類型為IEnumerable()

它到達了getProducts上的數據庫,因為這是它真正需要數據的唯一時間。

為了解決這個問題,在Scrape()添加.ToList()context.Products

事實是, 上下文實例上的屬性Products正在實現IEnumerable,因此,當將其與現場產品關聯時,您僅將可查詢對象轉換為IEnumerable。

如果直接使用context.Products(請嘗試),您將繼續看到IEnumerable為您提供的First以及任何其他擴展方法。

因此,您需要將其強制轉換為List以強制其在ctor上執行查詢(與對ProxyServers所做的相同)。

更多:

  1. 您正在執行沒有默認值的First,這可能會引發異常。
  2. 我不確定為什么要驗證產品中的第一個產品的ProductID> 0。

暫無
暫無

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

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