确定是否存在 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' 的第一个参数 可以找到(您是否缺少使用指令或程序集 参考?
我走在正确的轨道上吗?或者有更好的方法来测试这一点吗?
您正在对bool
值而不是List
使用Where
。 Any()
返回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)
}