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)
这是一篇关于实体框架的新功能的非常好的文章,它为表值UDF提供直接支持. MSDN博客关于实体框架中的表值函数支持.
为了更深入,本文提供了重要的细节.LINQ中公开的EDM和存储功能.
最近支持表值UDF的一大优势是支持全文搜索功能.在此处阅读更多相关信息:涉及数据库对象的全文搜索功能.