【发布时间】:2020-05-12 16:30:14
【问题描述】:
所以我想弄清楚如何检查我的数据库中是否存在某些东西。在这种情况下,它正在确定用户是否“喜欢”了一张图片,并将其作为真值或假值返回。我这样做的方法是检查这个'Like'是否有一个或多个版本,如果有,则返回true,否则返回false。这是代码。
我目前在做什么:
public bool checkCurrentUserLiked(int currentUserId, int imageId)
{
var hasData = _context.PhotoLikes.Where(x => x.LikerId == currentUserId && x.ImageId == imageId);
var dataToReturn = false;
if (hasData.Count() >= 1)
{
// entity exists in database
dataToReturn = true;
}
else
{
dataToReturn = false;
// nope
}
return dataToReturn;
}
我尝试过的另一种方法
public bool checkCurrentUserLiked(int currentUserId, int imageId)
{
bool hasData = _context.PhotoLikes.Any(x => x.LikerId == currentUserId && x.ImageId == imageId);
var dataToReturn = false;
if (hasData)
{
// entity exists in database
dataToReturn = true;
}
else
{
dataToReturn = false;
// nope
}
return dataToReturn;
}
当我到达:
如果 (hasData.Count() == 1),我得到的错误是: 在前一个操作完成之前,在此上下文上开始了第二个操作。不保证任何实例成员都是线程安全的。
它没有运行
[编辑]
我在这里遇到的错误是:无法将类型“System.Linq.IQueryable”隐式转换为“bool”
public bool checkCurrentUserLiked(int currentUserId, int imageId)
{
_context.PhotoLikes.Any(x => x.LikerId == currentUserId && x.ImageId == imageId);
}
【问题讨论】:
-
有什么问题?
-
if (hasData.Count() == 1),我得到的错误是:在前一个操作完成之前,在这个上下文上开始了第二个操作。不保证任何实例成员都是线程安全的。
-
你能澄清一下“检查这个'Like'是否有一个或多个版本”部分吗?在第一个示例中,
if (hasData.Count() == 1)将返回 false 如果您有多个结果,这可能是一个潜在的错误。如果多个PhotoLikes与给定条件匹配,则第二个示例_context.PhotoLikes.Any(x => x.LikerId == currentUserId && x.ImageId == imageId)将返回true。您实际上不必将其存储在单独的变量中。 -
在我看来,您并没有为每个请求生成一个新的 DbContext。您的 startup.cs 中的 db 上下文是如何配置的?
-
至于您的第二个错误“无法将类型 'System.Linq.IQueryable' 隐式转换为 'bool'”,我无法重新创建,我确定这只是一个错字,但你有在 _context.PhotoLikes.Any(...) 之前返回?我能够使用 IQueryable
重写您的方法并且它没有给出错误。