到目前为止我发现的所有内容,如果您调用表值函数,则返回值必须是 IQueryable。例如:
public IQueryable<AlbumsByGenre> ufn_AlbumsByGenre_ITVF(int genreId)
=> FromExpression(() => ufn_AlbumsByGenre_ITVF(genreId));
大多数情况下,当我使用表值函数时,返回的表类型是 DTO。也就是说,它与数据库中的任何实际表都不匹配。这是一个例子:
CREATE FUNCTION dbo.ufn_AlbumsByGenre_ITVF(@GenreId int)
RETURNS TABLE
AS
RETURN(
SELECT
ar.ArtistName,
al.AlbumName,
g.Genre
FROM Genres g
INNER JOIN Albums al
ON g.GenreId = al.GenreId
INNER JOIN Artists ar
ON al.ArtistId = ar.ArtistId
WHERE g.GenreId = @GenreId
);
为返回类型创建实体会导致数据库中出现不必要的、未使用的和不需要的表。在本例中,表名称是“AlbumsByGenre”。
有没有办法让返回类型成为未映射类型以防止不必要的表?
目前(从 EF Core 6.0 开始)该类型必须是模型类型(带或不带键)。有计划针对未映射类型的原始 SQL 查询 https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/plan对于 EF Core 7.0,它可能允许也可能不允许您要求的映射。
因此,现在您的类型必须在模型中注册(无法取消映射)。但创建关联表不是强制性的,可以通过配置它来避免ToView(null)
, e.g.
modelBuilder.Entity<AlbumsByGenre>()
.HasNoKey() // keyless
.ToView(null); // no table or view
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)