EF Core使用FREETEXTTABLE无法获取Rank值,如何解决?
EF Core中使用FREETEXTTABLE获取Rank值始终为0的解决办法
问题描述
我在SQL Server Management Studio中执行以下全文检索查询时,能正常返回正确的Rank值:
SELECT KEY_TBL.RANK, FT_TBL.* FROM dbo.Forums AS FT_TBL INNER JOIN FREETEXTTABLE(dbo.Forums, Title,'{searchTerm}') AS KEY_TBL ON FT_TBL.Id = KEY_TBL.[KEY] ORDER BY KEY_TBL.RANK DESC
但在API中用EF Core实现相同逻辑时,Rank始终返回0。
我的Forum模型定义如下:
public class Forum : BaseModel { public ApplicationUser? ForumAuthor { get; set; } public string ForumAuthorId { get; set; } = ""; [Required (AllowEmptyStrings = false,ErrorMessage = "A Title is required")] public string? Title { get; set; } public List<Post>? Posts { get; set; } [NotMapped] public int RANK { get; set; } }
由于数据库的Forums表没有RANK字段,我给模型里的RANK加了[NotMapped]特性。之后尝试创建不含该特性的ForumViewModel,查询后Rank还是0;去掉原模型的[NotMapped]能拿到有效Rank,但我不想在数据库表中新增RANK字段。
如何在不新增数据库字段的前提下,正确获取FREETEXTTABLE返回的Rank值?
解决方案
给模型中的RANK字段添加[DatabaseGenerated(DatabaseGeneratedOption.Computed)]数据注解即可解决问题:
public class Forum : BaseModel { public ApplicationUser? ForumAuthor { get; set; } public string ForumAuthorId { get; set; } = ""; [Required (AllowEmptyStrings = false,ErrorMessage = "A Title is required")] public string? Title { get; set; } public List<Post>? Posts { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public int RANK { get; set; } }
这个注解会告诉EF Core,该字段的值由数据库计算生成,无需映射到数据库表的物理字段,同时能正确读取查询返回的Rank值。
内容的提问来源于stack exchange,提问作者David.Warwick
相关产品推荐
相关产品推荐

