2011-08-16 58 views
0

努力學習LINQ到EF在MVC3項目...
很多在實體框架多對多關係:LINQ到實體框架M2M查詢與簡單的字符串約束

 
     Shirt    ShirtType   Type 
    -----------  -------------  --------- 
     ShirtID    ShirtID   TypeID 
     ShirtName   TypeID   TypeName 
     ShirtPrice 

ShirtType馬平表沒有其他領域那麼現在我在兩個實體Shirt.TypeType.Shirt中都有導航屬性。
在從數據庫生成實體之前,我在ShirtType中創建了複合PK,包括兩個外鍵。
我已經使用值填充了數據庫。
下面是我用它來查詢數據庫,以便返回襯衫與類型引用Type.Name==tName

 
public ActionResult Browse(string tName) 
     { 
      using (TShopEntities db=new TShopEntities()) 
      { 
       var typeModel = from s in db.Shirt 
           from t in s.Type 
           where t.TypeName == tName 
           select new tsStore.ModelView.ShirtView() 
           { 
            ShirtName=s.ShirtName, 
            ShirtPrice=s.ShirtPrice 
           }; 
       return View(typeModel.ToList()); 
      } 
     }

我的LINQ查詢返回任何內容並認爲版畫只是頭的代碼。我在這裏呆了一段時間,是linq查詢錯誤還是應該尋找其他錯誤?

回答

1

假設這是查詢你想要的:即用型Type.Name ==引用TNAME

並假設你的EF模型和數據庫是正確的

回報襯衫(很難說,因爲我看不到你的EDMX或你的FK的截圖)。

你的EDMX - Shirt和Type應該有2個實體。連接表將隱藏,因爲EF足夠聰明,可以在幕後進行隱式連接。

然後此查詢應該工作:

var shirtsOfAParticularType = db.Shirts.Where(shirt => shirt.Types.Any(type => type.TypeName == "someTypeName")).ToList(); 

記住,因爲它是一個many..many,一件襯衫可以有多種類型。因此,上面的查詢將返回至少包含類型的襯衫。

這就是你想要的嗎?

+0

Thx的男人,我真的明白,這兩個查詢都很好,但問題是別的。當我嘗試你的查詢我有相同的空列表,然後我只是硬編碼字符串「someTypeName」xmpl「樂隊」一些價值,它的工作。所以問題出在導航屬性的URL解析。將更新你與實際問題,thx反思,這是奇怪的如何以及當大腦開始工作:) – l0lander

+0

@streetspirit - 不知道你的意思是「這個問題是從導航屬性的URL解析」**。將等待您的修改。 – RPM1984

+0

路由參數有些問題,Action方法不會在字符串參數tName中獲取值,該值應該從http:// localhost:1491/Home/Browse獲取?類型=選擇鏈接時的頻段...正在工作 – l0lander

0

當加載所有三個實體的EDMX,實體框架創建兩個實體,而不是三:

A. Shirt - with scalar properties of ShirtID, ShirtName and ShirtPrice. 
      with navigation property to many Types (IEnumerable<Type>). 
B. Type - with scalar properties of TypeID and TypeName. 
      with navigation property to many Shirts (IEnumerable<Shirt>). 

然後,爲您創造實體的代碼後,你可以這樣做:

public ActionResult Browse(string tName) 
     { 
      using (TShopEntities db=new TShopEntities()) 
      { 
       var typeModel = from s in db.Type 
           select Shirts; 
       return View(typeModel.ToList()); 
      } 
     } 

而這就是全部。不要爲ShirtType創建另一個實體,因爲這不是創建模型的正確方法。