检查 ID 列表是否有效的更好方法(EF Core)



我在 html 页面中有一个复选框元素列表,所有元素都是可选的,并且具有不同的 ID,其 ID 通过 HTTP POST 发送到我的 API。为了安全起见,我需要检查任何发送的ID是否无效。它只是一个方法,如果这些 ID 中的任何一个在我的数据库中不存在,则返回 false,如果所有这些 ID 都存在,则返回 true。

最初看起来很容易,但我没有找到使用 EF Core 直接从我的数据库返回该结果的方法。我总是需要将查询结果的Count与我的列表Count进行比较。

我更好的方法是:

public async Task<bool> IsIdListValid(IEnumerable<int> idList) =>
(await _context.Foo
.Select(x => x.Id)
.CountAsync(id => idList.Contains(id))
) == idList.Distinct().Count();

所以,我要问的是:有更好的方法来编写该查询,更具可读性和性能?

您要查找的是All

public async Task<bool> IsIdListValid(IEnumerable<int> idList)  
{
var validIds = await _context.Foo.Select(x => x.Id).ToListAsync();
return idList.All(x => validIds.Contains(x));
}

假设你有名为"idsLst"的 id 列表,所以你将从 db 获取所有匹配的 id,然后将从 db 返回的返回的 id 列表与你的列表进行比较(如果它们相同(,所以所有列表项都存在于 db 中,如果有差异,这意味着你有一些无效的 ID

var validIds = DbContext
.UREntity
.Where(x => idsLst.Contains(x.Id))
.Select(x => x.Id);

var invalidIdsLst = ids.Except(validIds);
return invalidIdsLst.Count == 0; // return true if all valid

您可以直接实现您的问题,而不是按计数进行验证:

public async Task<bool> IsIdListValid(IEnumerable<int> idList) =>
idList.Any(id => !_context.Foo.Any(f => f.id == id));

这将在有效时按idList成员发送 SQL 查询。如果idList很短,这可能没问题,否则您的Count查询可能是最好的,尽管不需要Select。但是,如果idList包含无效成员,这将快捷方式,并在第一个无效成员上停止。

另一种可能性是使用 EntityFrameworkCore.MemoryJoin 扩展,该扩展增加了使用 SQLVALUES发送内存中列表然后加入其中的功能。

最新更新