我有一个具有Id和User属性的Post实体。 用户是IdentityUser。 我的实体上没有UserId属性,因为我不需要它。
如何以最佳方式检查该帖子是否属于当前用户? 我想到了这个
var currentUser = await userManager.GetUserAsync(httpAccessor.HttpContext.User);
if (!await context.Posts.FromSql(
@"SELECT TOP 1 UserId
FROM Posts
WHERE Id = {0}", postId).Any(Id => Id == currentUser.Id))
throw new InvalidOperationException("Post does not belong to current user.");
或者
if (!await context.Posts.AnyAsync(p => p.Id == post.Id && p.User.Id == currentUser.Id))
throw new InvalidOperationException("Post does not belong to current user.");
但它不起作用。
这是从第二个选项
生成的SQLSELECT CASE
WHEN EXISTS (
SELECT 1
FROM [Posts] AS [p]
INNER JOIN [AspNetUsers] AS [p.User] ON [p].[UserId] = [p.User].[Id]
WHERE ([p].[Id] = @__post_Id_0) AND ([p.User].[Id] = @__currentUser_Id_1))
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END
答案 0 :(得分:0)
对于您的情况"最佳"方法是从数据库中读取Post对象($ which gcloud
/home/myusername/google-cloud-sdk/bin/gcloud
$ sh -c '/home/myusername/google-cloud-sdk/bin/gcloud version'
并在其上检查var post = await context.Posts.SingleAsync(x => x.Id = postId);
。
这将导致从User
读取所有属性,包括大文本(帖子正文等)。您可以尝试通过仅选择匿名类的特定属性来避免这种情况:
Post