Ciao, non posso fare delle prove ora e non tocco ef da un po' perciò ti rispondo "a naso". Prendi tutto come un "dovrebbe essere..."
Il problema potrebbe essere qui:
codice:
var subCatObj = (from SubCategory_Product t in contextDB.SubCategory_Products
where t.IDSubCategory == prodoctsDB.SubCategory
select t).SingleOrDefault();
if (subCatObj.Product!= null)
{
int ed = subCatObj.Product.Count;
}
Prima dell'if tu non puoi vedere se i prodotti sono stati caricati o meno se non utilizzando sqlprofiler infatti con lazy abilitato o meno tu "costringi" EF a fare una query ai prodotti nel momento in cui gli chiedi il count. Finche non converti subcatobj in una collection (ToList()) il count lo fai attraverso EF (e quindi al db, che ti carica il grafo dei prodotti) e non con linq to object.
Per toglierti il pensiero senza sql-profiler, prova a mettere un ToList alla fine della query e vedere se continua ad entrare nell'IF. (Una volta che ti togli il pensiero puoi anche toglerlo e sei tranquillo che finche non gli chiedi qualcosa ai relativi prodotti lui non te li tocca)
Se invece ti serve comunque il count dei prodotti (o una qualsiasi aggregazione su di essi) ma non vuoi caricarne l'intero grafo:
codice:
var query= contextDB.SubCategory_Products
.Where(c => c.IDSubCategory == categoria)
.Collection(p => p.Product)
.Query() //Da qui in poi puoi interrogare i prodotti senza caricarli
.Count(); //occhio questo con le parentesi è il cont di linq!