我们在 SQL Server 数据库中有自定义类型
CREATE TYPE dbo.UniqueIdentifiers AS TABLE (Identifier UNIQUEIDENTFIER)
该类型的目的是将其用于查找具有提供的标识符的记录的查询。
SELECT * FROM MyRecords WHERE Id IN (@GivenIdentifiers)
我们有许多像上面这样的查询,它们使用不同的标识符列表被多次调用,通过将标识符列表作为 SQL 参数,我们正在提高查询的性能,因为 SQL Server 将使用已经编译的 SQL 查询而不是编译新的查询,因为标识符列表已更改。
现在,我们将使用 EF Core 作为我们使用 SQL Server 数据库的应用程序的工作单元,但我无法找到如何使用 EF Core 查询语法使用表值参数的方法。
此时此刻我们有
public Order[] LoadOrders(params Guid[] identifiers)
{
return context.Orders.Where(order => identifiers.Contains(order.Id)).ToArray();
}
它生成带有“硬编码”标识符的sql(见下文),当使用不同的标识符调用相同的方法时,生成的查询将会不同,这将“强制”SQL Server再次编译查询,这是我们试图避免的
SELECT * FROM MyRecords WHERE Id IN ('1234abcd-...', '1234abce-...')
我们仍然可以通过“手动”构建查询来使用原始方法,但此时我们希望避免这种情况,因为我们希望能够通过“动态”连接其他表来构建不同的查询(使用 EF Core 查询扩展)方法),而无需为我们使用类似“WHERE”条件的每个表显式引入单独的“构建查询”。
我们如何在 EF Core 中使用表值参数?