Table Valued Function and Entity Framework

前端 未结 3 1327
生来不讨喜
生来不讨喜 2021-02-05 13:28

I\'m trying to execute an TVF with Entity Framework and for some reason it just doesn\'t work. Maybe anyone out there can help me see the problem.

Here are the code samp

3条回答
  •  长发绾君心
    2021-02-05 14:07

    [Tested] using:

    Install-Package EntityFramework.CodeFirstStoreFunctions
    

    Declare a class for output result:

    public class MyCustomObject
    {
       [Key]
       public int Id { get; set; }
       public int Rank { get; set; }
    }
    

    Create a method in your DbContext class

    [DbFunction("MyContextType", "SearchSomething")]
    public virtual IQueryable SearchSomething(string keywords)
    {
       var keywordsParam = new ObjectParameter("keywords", typeof(string)) 
                               { 
                                  Value = keywords 
                                };
        return (this as IObjectContextAdapter).ObjectContext
        .CreateQuery(
         "MyContextType.SearchSomething(@keywords)", keywordsParam);
    }
    

    Add

    public DbSet SearchResults { get; set; }
    

    to your DbContext class

    Add in the overriden OnModelCreating method:

    modelBuilder.Conventions
    .Add(new CodeFirstStoreFunctions.FunctionsConvention("dbo"));
    

    And now you can call/join with a table values function like this:

    CREATE FUNCTION SearchSomething
    (   
        @keywords nvarchar(4000)
    )
    RETURNS TABLE 
    AS
    RETURN 
    (SELECT KEY_TBL.RANK AS Rank, Id
    FROM MyTable 
    LEFT JOIN freetexttable(MyTable , ([MyColumn1],[MyColumn2]), @keywords) AS KEY_TBL      
    ON MyTable.Id = KEY_TBL.[KEY]  
    WHERE KEY_TBL.RANK > 0   
    )
    GO
    

提交回复
热议问题