2012-04-12 33 views
0

我正在嘗試使用MVC3構建Internet商店。我使用的EF和我有一個接口與我的實體上下文工作:MVC中的Lambda表達式3

public interface IBaseRepository<T> where T : class, IBase, new() 
{ 
    IQueryable<T> Get(); 
} 

和一個抽象類,這個接口的工作:

public abstract class BaseRepository<T> : 
     IBaseRepository<T> where T : class, IBase, new() 
{ 
    protected abstract ObjectSet<T> EntitySet { get; } 

    public virtual IQueryable<T> Get() 
    { 
     return from obj in EntitySet select obj; 
    } 
} 

這樣我就可以使用此解決方案具有不同的工作我的數據庫中的表(SQL)。我還無法發佈圖片。所以我會盡力來形容我的數據庫:

[產品] - [CategoryProduct(產品ID,類別ID)] - [類別(SHORTNAME)

  1. 表產品
  2. 表類別與現場SHORTNAME
  3. 表類別產品與字段ProductID,CategoryID進行多對多鏈接。

(我們正在越來越接近問題....)

我有一個方法,它需要從表「類別」,「短名稱」(「庫」是的DbContext只有一個表 - 「類別」),我需要在我看來回報產品的IEnumerable的<>:

public ActionResult GetProductInCategory(string shortName) 
{ 
     IEnumerable<Product> = repository.Get()...... 
     return View(); 
} 

因此,這裏的問題:我需要做一個查詢使用lambda採取從這3個表格的產品,但我無法理解,如何做到這一點。

我不能使用linq,因爲我只能直接訪問整個數據庫中的一個表。

對不起,如果你有任何關於架構的問題來獲得整個視圖,我會盡力回答你。

+0

所以你想要使用lambda返回數據(你需要LINQ),但是因爲沒有權限而無法獲取數據? :S – mattytommo 2012-04-12 09:15:23

+0

我想,這並不是說他沒有權限,問題是他的'IBaseRepository '只能輸入'T'。 – gideon 2012-04-12 09:36:43

回答

0

我假設/從您的使用EntitySet你正在使用的EntityFramework的猜測,你有你實體類本結構

Category 
+ShortName 
+EntityCollection<CategoryProduct> CategoryProduct 

CategoryProduct 
+Product 

所以,你可以在你的LINQ查詢做到這一點:

BaseRepository<Category> repository = //get your CATEGORY repository 
IEnumerable<Product> = repository.Get().Where(c=> c.ShortName == shortName) 
             .SelectMany(cp => cp.CategoryProduct) 
             .Select(p => p.Product).ToList(); 
+0

感謝您的回答。它很棒! – AlexSolovyov 2012-04-12 10:44:41