[英]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所做的相同)。
更多:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.