2015-12-16 37 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) 
     } 
相关问题