代码之家  ›  专栏  ›  技术社区  ›  Stephen Jennings

如何从LINQ到SQL的全文搜索查询中获取排名?

  •  1
  • Stephen Jennings  · 技术社区  · 15 年前

    我正在使用Linq to SQL调用一个存储过程,该过程运行全文搜索并返回列组以及表中的一些特定列。 Article . rank列是从SQL函数freetexttable()返回的秩。我已经用返回类型将这个存储过程添加到O/R设计器中 文章 .

    这是为了获得我需要的列;但是,它会丢弃每个搜索结果的排名。我想获取此信息以便向用户显示。

    到目前为止,我已经尝试创建一个新的类 RankedArticle 继承自 文章 并添加列 Rank ,然后将存储过程映射的返回类型更改为 大文章 . 尝试此操作时,将引发InvalidOperationException:

    “heap.models.article”类型的数据成员“Int32 ArticleID”不是“rankedarticle”类型的映射的一部分。成员是否位于继承层次结构的根之上?

    如果让O/R设计器设置存储过程自己的返回类型,它将返回一个int而不是“searchArticlesByKeywordResult”对象。我不知道为什么会这样,也许是因为存储过程返回了一个联合?这是我的程序:

    BEGIN
    SET NOCOUNT ON;
    (
        SELECT ftt.[rank] as [Rank], ArticleID, Subject
        FROM Article
        INNER JOIN FREETEXTTABLE( Article, (Subject, Body), @KeywordList ) AS ftt
        ON ftt.[key] = Article.ArticleID
    
        UNION
    
        SELECT ftt.[rank] as [Rank], Article.ArticleID as ArticleID, Article.Subject as Subject
        FROM Article
        INNER JOIN Solution ON Solution.ArticleID = Article.ArticleID
        INNER JOIN FREETEXTTABLE( Solution, Body, @KeywordList ) AS ftt
        ON ftt.[key] = Solution.SolutionID
    )
    ORDER BY [Rank] DESC
    END
    

    我似乎找不到任何其他的问题或谷歌搜索结果的人试图获得排名栏,所以我可能错过了一些明显的东西。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Raj Kaimal    15 年前

    转到SQL Management Studio,使用@keywordList作为空值调用存储过程。你看到什么错误了吗?除了其他事情外,Linq to SQL还调用带有空值的存储过程来发现返回列。