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

本文关键字:字段 两个 记录 存在 是否 MVC | 更新日期: 2023-09-27 18:27:14

我有一个用于此解决方案的表(和一个相应的类(,其中只有两个字段,即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' 的第一个参数 可以找到(您是否缺少使用指令或程序集 参考?

我走在正确的轨道上吗?或者有更好的方法来测试这一点吗?

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

您正在对bool值而不是List使用WhereAny()返回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);

您正在调用 .在 .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);

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

你的问题是Any()返回一个bool,所以你不能调用Where()

Where ,返回另一个IEnumerable,所以如果你把Where放在Any()之前,你就不会有这个问题。

您也可以将这两个条件放在Any()中,即 someEnumerable.Any(/*condition1*/ && /*condition1*/);


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

这将让你做一些事情,比如

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

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

补充@Azim答案

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

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