表值函数和实体框架

Bru*_*ese 13 c# linq entity-framework user-defined-functions ef-code-first

我正在尝试使用实体框架执行一个TVF,由于某种原因它只是不起作用.也许那里的任何人都可以帮助我看到问题.

以下是代码示例:

这是功能:

CREATE FUNCTION [dbo].[udf_profileSearch]
(@keywords NVARCHAR(3000))
RETURNS @results TABLE 
(
    [Id] [int] NULL,
    [SubCategoryId] [int] NULL,
    [UserId] [int] NULL,
    [SmallDescription] [nvarchar](250) NULL,
    [DetailedDescription] [nvarchar](500) NULL,
    [Graduation] [nvarchar](140) NULL,
    [Experience] [nvarchar](500) NULL,
    [IsChat] [bit] NULL,
    [IsEmail] [bit] NULL,
    [MinuteCost] [decimal](18, 2) NOT NULL,
    [TestimonyRate] [int] NULL,
    [TestimonyQuantity] [int] NULL,
    [StatusId] [int] NULL
)

AS
BEGIN
IF(@keywords != '')
    BEGIN
        insert @results
            SELECT p.Id, p.SubCategoryId, p.UserId, p.SmallDescription, p.DetailedDescription, p.Graduation, 
                        p.Experience, p.IsChat, p.IsEmail, p.MinuteCost, p.TestimonyRate, p.TestimonyQuantity, 
                        p.StatusId FROM 
            Profile p inner join ProfileSearchKeyword psk
            ON p.Id = psk.ProfileId
            WHERE CONTAINS(psk.*,@keywords)
    END
ELSE 
    BEGIN
        insert @results
            SELECT p.* FROM 
            Profile p inner join ProfileSearchKeyword psk
            ON p.Id = psk.ProfileId
    END
RETURN
END
Run Code Online (Sandbox Code Playgroud)

我在我的DbContext文件中有这个(名为EAjudaContext)

[EdmFunction("eAjudaConnection", "udf_profileSearch")]
    public virtual IQueryable<Profile> udf_profileSearch(string keywords)
    {
        var keywordsParameter = keywords != null ?
            new ObjectParameter("keywords", keywords) :
            new ObjectParameter("keywords", typeof(string));

        return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<Profile>("eAjudaConnection.udf_profileSearch(@keywords)", keywordsParameter);
    }
Run Code Online (Sandbox Code Playgroud)

这就是我通过LINQ调用func的方式

var result = from ps in eAjudaCtx.udf_profileSearch("query") select ps
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:


'eAjudaConnection.udf_profileSearch' cannot be resolved into a valid type or function.

关于我缺少的任何想法?我已经尝试了几乎我在谷歌上发现的每一个提示,但没有解决我的问题.

如果您需要查看此处未包含的任何代码,请询问并添加.

Nin*_*ina 13

[测试]使用:

Install-Package EntityFramework.CodeFirstStoreFunctions
Run Code Online (Sandbox Code Playgroud)

为输出结果声明一个类:

public class MyCustomObject
{
   [Key]
   public int Id { get; set; }
   public int Rank { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在DbContext类中创建一个方法

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

public DbSet<MyCustomObject> SearchResults { get; set; }
Run Code Online (Sandbox Code Playgroud)

到你的DbContext类

添加覆盖OnModelCreating方法:

modelBuilder.Conventions
.Add(new CodeFirstStoreFunctions.FunctionsConvention<MyContextType>("dbo"));
Run Code Online (Sandbox Code Playgroud)

现在你可以用这样的表值函数调用/ join:

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
Run Code Online (Sandbox Code Playgroud)


dev*_*ost 5

这是一篇关于实体框架的新功能的非常好的文章,它为表值UDF提供直接支持. MSDN博客关于实体框架中的表值函数支持.

为了更深入,本文提供了重要的细节.LINQ中公开的EDM和存储功能.

最近支持表值UDF的一大优势是支持全文搜索功能.在此处阅读更多相关信息:涉及数据库对象的全文搜索功能.