【问题标题】:Check if something exists in .net core database and return as boolean检查 .net 核心数据库中是否存在某些内容并以布尔值返回
【发布时间】: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 重写您的方法并且它没有给出错误。

标签: c# .net-core


【解决方案1】:

试试这个:

    public bool checkCurrentUserLiked(int currentUserId, int imageId)
        => _context.PhotoLikes.Any(x => x.LikerId == currentUserId && x.ImageId == imageId));



【讨论】:

    【解决方案2】:

    我已经尝试了所有建议的方法,但都没有奏效,我最终做的是删除该函数并在需要它的属性中重写它。

    这就是我的意思:

    'hasCurrentUserLiked' 是我试图解决的问题。我并没有真正进行任何重大更改,我只是更改了代码(不知道为什么会这样,但确实如此)

                (f, p) => new FeedsForReturnDto
                {
                    Id = f.feed.Id,
                    PhotoUrl = f.feed.photoUrl,
                    Username = f.feed.Username,
                    Description = f.feed.Description,
                    DateAdded = f.feed.DateAdded,
                    IsImage = f.feed.IsImage,
                    // v Is the thing we were trying to figure out
                    hasCurrentUserLiked = _context.PhotoLikes.Any(x => x.LikerId == user.Id && x.ImageId == f.feed.Id),
                    Likes = _context.PhotoLikes.Where(x => x.ImageId == f.feed.Id).Count()
                });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2021-08-11
      • 2018-08-15
      • 2023-03-28
      • 2019-06-29
      • 1970-01-01
      相关资源
      最近更新 更多