2012-12-03 112 views
2

我正在通過在線視頻教程學習LINQ,ASP.NET,EF和MVC。我會喜歡一些幫助理解LINQ擴展方法語法中的聯接。Linq擴展加入方法

爲了簡化起見,我有兩個表(它們映射到SQL數據庫):

User Table: 
    public int userID{get;set;} 
    public string firstName{get;set;} 
    ... 

Address 
    public int ownerID{get;set;} 
    public int value{get;set;} 
    public string Nickname{get;set;} 
    public string street{get;set;} 
    public string zip{get;set;} 
    ... 

比方說,我想找到的所有特定用戶擁有的財產。我相信我可以做這樣的事情:

var test = db.User 
    .Join(db.Address, user => user.userID, add => add.ownerID, (user, add) => new { user, add }); 
Source: http://byatool.com/c/linq-join-method-and-how-to-use-it/ 

這應該是等同於

SELECT * FROM User a JOIN Address b on a.userID = b.ownerID 

請確認這是正確的。

現在,如果我想查找特定用戶擁有的具有value greater than x的所有財產,該怎麼辦。讓我們進一步說,x是另一個LINQ查詢的結果。如何在第二個查詢中強制執行x?我甚至不得不考慮這一點,否則LINQ會在這種情況下知道該怎麼做?

感謝

編輯: 當我嘗試使用查詢作爲另一個參數的結果,我需要使用一個貪婪的經營者強制執行。許多人喜歡使用.Count().ToList()。我只希望x(來自上面的示例)通過使用.Take(1)返回1個字符串。如果我追加ToList()到我的第一個查詢結束,我需要在我的第二個查詢中使用x [0]。這似乎是一種混亂的做事方式。當你知道只有1個結果時,是否有更好的方法來強制執行查詢?

+1

聽起來像你可以試試看,如果它會工作,或會發生什麼。你似乎有想要嘗試的想法。如果經過幾次嘗試,你無法實現它,在這裏發佈你的代碼以及你得到的錯誤將幫助我們判斷你的位置。 – Servy

+0

@Servy我對我的問題做了一些修改。如果您有機會請檢查它。謝謝 – Jeff

+0

看來你正在尋找以下其中之一:'First','FirstOrDefault','Single','SingleOrDefault'。 – Servy

回答

3

如果我理解你的問題,你試圖對聯合模型做一個條件?

var query = db.Users.Where(x => x.Addresses.Where(y => y.Value >= yourValue).Any()); 

,將返回誰擁有的屬性值比yourValue更大的所有用戶。如果您需要使用查詢返回地址,則可以將Include添加到您的查詢中。例如:

query.Include(x => x.Addresses); 

您不需要手動執行您在示例中具有的Join