确定MVC中两个字段必须匹配的记录是否存在

时间:2015-12-16 18:05:31

标签: c# asp.net-mvc record

我有一个表(和相应的类)用于此解决方案,只有两个字段是UserId和TicketId。现在我需要测试此表中是否存在记录,其中UserId与登录的个人匹配,而TicketId与传递的值匹配。这是我试过的代码:

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'不包含'where'和no的扩展方法   扩展方法'where'接受'bool'类型的第一个参数   可以找到(你错过了使用指令或程序集   参考

我是否在正确的轨道上?还是有更好的方法来测试它?

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

你在.Any的结果上调用.Where,这是一个布尔值。尝试结合你的子句,然后在整个事情上调用.Any:

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);

答案 2 :(得分:0)

您的问题是Any()会返回bool,因此您无法在其上调用Where()

Where,返回另一个IEnumerable,因此,如果您将Where放在Any()之前,则您不会遇到此问题。

您也可以将两个条件都放在Any() I.E. someEnumerable.Any(/*condition1*/ && /*condition1*/);

另一方面,如果我是你,我会使用导航属性。您可以谷歌搜索"导航属性"以及您正在使用的任何数据库框架的名称(如实体框架或linq to sql)以查找更多信息。

这会让你做像

这样的事情
subscriptionExists = db.TicketSubscriptions
    .Any(ts => ts.Ticket.TicketNumber == ticketNumber 
      && ts.User.NTUserName == User.Identity.Name);

另一方面,我相信User.Identity将拥有用户ID,因此您甚至不必费心去访问用户表。 Intellisence可以帮助您了解如何访问它。

答案 3 :(得分:0)

TicketSubscriptions.Any()返回Bool。

结果是真或假。所以你无法继续查询到哪里。编写代码更易读。你可以更容易地看到错误。在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 );

答案 4 :(得分:0)

补充@Azim答案

使用时.FirstOrDefault必须验证返回的值。否则,如果您确定返回值永远不为null,则必须使用.First

        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)
        }