2015-12-16 38 views
0

我有一個只有兩個字段UserId和TicketId的解決方案的表(和相應的類)。現在我需要測試一個記錄是否存在於這個表中,其中UserId與登錄的個人相匹配,並且TicketId與傳遞的值匹配。這是我試過的代碼:確定MVC中兩個字段必須匹配的記錄是否存在

bool subscriptionExists = db.TicketSubscriptions.Any(ts => ts.TicketId.Equals(db.Tickets.FirstOrDefault(t => t.TicketNumber == ticketNumber).TicketId)) 
    .Where(ts => ts.UserId == db.Users.FirstOrDefault(u => u.NTUserName.Equals(User.Identity.Name)).UserId); 

不過,我收到以下錯誤:

'bool' does not contain an extension method for 'where' and no extension method 'where' accepting a first argument of type 'bool' could be found (are you missing a using directive or an assembly reference?

我在正確的軌道上?還是有更好的方法來測試這個?

回答

0

您使用Where的值爲bool而不是ListAny()返回bool。你可以嘗試如下。希望這會幫助你。

var ticketId=db.Tickets.FirstOrDefault(t =>t.TicketNumber==ticketNumber).TicketId; 
var userId=db.Users.FirstOrDefault(u=>u.NTUserName.Equals(User.Identity.Name)).UserId; 

bool subscriptionExists = db.TicketSubscriptions. 
          Any(ts => ts.TicketId.Equals(ticketId) && ts.UserId == userId); 
+0

阿茲姆你是男人 – djblois

0

你打電話的。任何,這是一個布爾值的結果。凡。嘗試結合您的條款,然後在整個事情調用。任何:

bool subscriptionExists = db.TicketSubscriptions.Any(
     ts => ts.TicketId.Equals(db.Tickets.FirstOrDefault(t => t.TicketNumber == ticketNumber).TicketId) && 
       ts.UserId == db.Users.FirstOrDefault(u => u.NTUserName.Equals(User.Identity.Name)).UserId); 
0

您的問題是,Any()返回bool,所以你不能在它調用Where()

Where,返回另一個IEnumerable,所以如果你在Any()之前放Where,你就不會有這個問題。

你也可以把裏面的Any()即兩個條件someEnumerable.Any(/*condition1*/ && /*condition1*/);


在另一方面,我會利用導航屬性的,如果我是你。你可以谷歌搜索「導航屬性」和你使用的任何數據庫框架的名稱(如實體框架或LINQ到SQL)來查找更多信息。

,可以讓你做的事情一樣

subscriptionExists = db.TicketSubscriptions 
    .Any(ts => ts.Ticket.TicketNumber == ticketNumber 
     && ts.User.NTUserName == User.Identity.Name); 

在另一個說明,我相信User.Identity都將有用戶ID,所以你甚至不必費心訪問用戶這樣的桌子。 Intellisence可以幫助您瞭解如何訪問它。

0

TicketSubscriptions.Any()返回一個布爾值。

它是結果是真或假。所以你不能繼續用where來查詢。編寫更具可讀性的代碼。你可以更容易地看到錯誤。在any()函數中,你需要一個像if語句這樣的布爾語句。您可以簡單地使用||&&標誌。

var userId = User.Identity.Name; 
var passedValue = ... // I dont know if it is from a parameter. 

bool subscriptionExists = TicketSubscriptions.Any(ts => ts.NTUserName == userId && ts.TicketId == passedValue); 
0

補充了@Azim答案

當您使用.FirstOrDefault必須驗證返回的值。否則,如果您確定返回值永不爲零,則必須使用。第一

 var ticketId=db.Tickets.FirstOrDefault(t =>t.TicketNumber==ticketNumber).TicketId; 
     varuserId=db.Users.FirstOrDefault(u=>u.NTUserName.Equals(User.Identity.Name)).UserId; 

     if(ticketId != null && userId != null) 
     { 

       bool subscriptionExists = db.TicketSubscriptions. 
            Any(ts => ts.TicketId.Equals(ticketId) && ts.UserId == userId) 
     } 
相關問題