我有一个表(和相应的类)用于此解决方案,只有两个字段是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'类型的第一个参数 可以找到(你错过了使用指令或程序集 参考
我是否在正确的轨道上?还是有更好的方法来测试它?
答案 0 :(得分:0)
您在Where
值而不是bool
上使用List
。 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);
答案 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)
}