gpt4 book ai didi

c# - 表值函数和 Entity Framework

转载 作者:可可西里 更新时间:2023-11-01 08:07:00 27 4
gpt4 key购买 nike

我正在尝试使用 Entity Framework 执行 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

我的 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);
}

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

var result = from ps in eAjudaCtx.udf_profileSearch("query") select ps

我得到这个错误:


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

关于我遗漏的任何想法?我几乎尝试了在 google 上找到的所有提示,但没有一个解决了我的问题。

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

最佳答案

[测试]使用:

Install-Package EntityFramework.CodeFirstStoreFunctions

为输出结果声明一个类:

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

在您的 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);
}

添加

public DbSet<MyCustomObject> SearchResults { get; set; }

到你的 DbContext 类

添加覆盖的 OnModelCreating 方法:

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

现在你可以打电话/加入表值函数如下:

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

关于c# - 表值函数和 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18454578/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com