首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >EF:从C#将表值参数传递给用户定义的函数。

EF:从C#将表值参数传递给用户定义的函数。
EN

Stack Overflow用户
提问于 2020-09-04 06:16:52
回答 2查看 2.6K关注 0票数 13

我在Server中有一个用户定义的函数,它接受一个TVP (表值参数)作为参数。在EF中,如何从C#调用这样的函数?

我尝试使用ObjectContext.CreateQuery<>方法,但得到了以下错误:

函数'QueryByParam‘的参数'param’无效。参数只能是可以转换为Edm标量类型的类型。

也尝试了ObjectContext.ExecuteStoreQuery<>方法,得到了同样的错误。无论如何,它不会返回一个IQueryable

样本代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[DbFunction(nameof(SampleDbContext), "QueryByParam")]
public IQueryable<SecurityQueryRow> QueryByParam(IEnumerable<ProfileType> profiles, bool isActive = false)
{
    DataTable dataTable = ....
    ObjectParameter profilesParam = new ObjectParameter("profileTypeIds", dataTable);

    ObjectParameter isActiveParam = new ObjectParameter("isActive ", isActive);

    return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<SecurityQueryRow>(
            string.Format("[{0}].[{1}](@profileTypeIds, @isActive)", GetType().Name, "QueryByParam"),
            profilesParam,
            isActiveParam);
}

需求是我们需要一个IQueryable返回,而不是消耗的结果。

EN

回答 2

Stack Overflow用户

发布于 2020-09-07 09:09:14

您可以使用(类似于EF6中的aproach )来实现它,但是您不能获得一个IQueryable。这两个例子都在下面。

实体框架核心

SQL类型用作列表筛选器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TYPE [dbo].[Table1Type] AS TABLE(
    [Id] [int] NULL,
    [Name] [nchar](10) NULL
)

SQL UDF:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE FUNCTION [dbo].[Func1] 
(   
    @Ids Table1Type readonly
)
RETURNS TABLE 
AS
RETURN
(
    SELECT * from Table1 where id in (select Id from @Ids)
)

EF上下文:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyContext : DbContext
{
    public DbSet<Table1> Table1 { get; set; }
}

DTO以匹配sql (也与表相同):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Table1
{
    public int Id { get; set; }
    public string Name { get; set; }
}

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static void Main(string[] args)
{
    using (var context = new MyContext())
    {
        // Declare de Structure filter param
        var dt = new DataTable();

        DataTable table = new DataTable();
        table.Columns.Add(new DataColumn("Id", typeof(int)));
        table.Columns.Add(new DataColumn("Name", typeof(string)));
        DataRow row = table.NewRow();
        row["Id"] = 1;
        row["Name"] = "Item";
        table.Rows.Add(row);
        var param = new SqlParameter("@Ids", table) { TypeName = "dbo.Table1Type", SqlDbType = SqlDbType.Structured };

        IQueryable<Table1> query = context.Table1.FromSqlRaw("SELECT * FROM dbo.func1(@Ids)", param);
        var result = query.ToList();
    }
}

实体框架6

您无法获得IQueryable,但可以将其链接到生成的IEnumerable。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static void Main(string[] args)
{
    using (var context = new MyContext())
    {
        context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

        // Declare de Structure filter param
        var dt = new DataTable();

        DataTable table = new DataTable();
        table.Columns.Add(new DataColumn("Id", typeof(int)));
        table.Columns.Add(new DataColumn("Name", typeof(string)));
        DataRow row = table.NewRow();
        row["Id"] = 1;
        row["Name"] = "Item";
        table.Rows.Add(row);
        var param = new SqlParameter("@Ids", table) { TypeName = "dbo.Table1Type", SqlDbType = SqlDbType.Structured };

        var query = context.Table1.SqlQuery("SELECT * FROM dbo.func1(@Ids)", param);

        var result = query.ToList();
    }
}
票数 9
EN

Stack Overflow用户

发布于 2020-09-09 04:01:18

AdventureWorks示例数据库有一个表值函数dbo.ufnGetContactInformation,它的返回类型也可以表示为另一个复杂类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ComplexType]
public class ContactInformation
{
    public int PersonID { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string JobTitle { get; set; }

    public string BusinessEntityType { get; set; }
}

然后,可以通过以下方式映射ufnGetContactInformation函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Defines table-valued function, which must return IQueryable<T>.
[Function(FunctionType.TableValuedFunction, nameof(ufnGetContactInformation), Schema = dbo)]
public IQueryable<ContactInformation> ufnGetContactInformation(
    [Parameter(DbType = "int", Name = "PersonID")]int? personId)
{
    ObjectParameter personIdParameter = personId.HasValue
        ? new ObjectParameter("PersonID", personId)
        : new ObjectParameter("PersonID", typeof(int));

    return this.ObjectContext().CreateQuery<ContactInformation>(
        $"[{nameof(this.ufnGetContactInformation)}](@{nameof(personId)})", personIdParameter);
}

它的返回类型应该是IQueryable,因此它在LINQ实体中是可组合的。它可以称为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[TestMethod]
public void CallTableValuedFunction()
{
    using (AdventureWorks database = new AdventureWorks())
    {
        IQueryable<ContactInformation> employees = database.ufnGetContactInformation(1).Take(2);
        Assert.IsNotNull(employees.Single());
    }
}

上面的ufnGetContactInformation调用和接受调用将被转换为一个单一的SQL查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
exec sp_executesql N'SELECT TOP (2) 
    [top].[C1] AS [C1], 
    [top].[PersonID] AS [PersonID], 
    [top].[FirstName] AS [FirstName], 
    [top].[LastName] AS [LastName], 
    [top].[JobTitle] AS [JobTitle], 
    [top].[BusinessEntityType] AS [BusinessEntityType]
    FROM ( SELECT TOP (2) 
        [Extent1].[PersonID] AS [PersonID], 
        [Extent1].[FirstName] AS [FirstName], 
        [Extent1].[LastName] AS [LastName], 
        [Extent1].[JobTitle] AS [JobTitle], 
        [Extent1].[BusinessEntityType] AS [BusinessEntityType], 
        1 AS [C1]
        FROM [dbo].[ufnGetContactInformation](@PersonID) AS [Extent1]
    )  AS [top]',N'@PersonID int',@PersonID=1
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63742915

复制
相关文章
分享10个必备的VS Code技巧和窍门,提高你的开发效率
你知道全球73%的开发者都依赖于同一个代码编辑器吗?是的,2023年Stack Overflow开发者调查结果已经出来了,而且再次证明,Visual Studio Code是迄今为止使用最广泛的开发环境。
前端达人
2023/09/11
5660
分享10个必备的VS Code技巧和窍门,提高你的开发效率
Visual Studio Code1.67版本已正式发布,新增Rust指南
Visual Studio Code1.67版本已正式发布,该版本包含大量增强生产力的更新项:
小柔
2023/10/14
3670
Visual Studio Code1.67版本已正式发布,新增Rust指南
maven缺少依赖包,强制更新依赖命令
-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。
一个会写诗的程序员
2020/04/30
7.3K0
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )
Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , 以及注解属性 ; 在 Activity 基类中 , 获取该注解 以及 注解属性 , 进行相关操作 ;
韩曙亮
2023/03/29
7060
【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )
提高生产力的10个必备VS Code技巧和窍门
快来免费体验ChatGpt plus版本的,我们出的钱 体验地址:https://chat.waixingyun.cn 可以加入网站底部技术群,一起找bug,另外新版作图神器已上线 https://cube.waixingyun.cn/home
前端小智@大迁世界
2023/09/10
3410
提高生产力的10个必备VS Code技巧和窍门
打包并自动安装sql数据库
打包,并自动安装SQL数据库 应一位网友的需求,并修正了MVP李洪根".NET平台下WEB应用程序的部署(安装数据库和自动配置)"中的osql用法错误,已测试通过。 一).创建部署项目 1. 在“文件”菜单上指向“添加项目”,然后选择“新建项目”。 2. 在“添加新项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“安装项目”。在“名称”框中键入 setup1。 3. 单击“确定”关闭对话框。 4. 项目被添加到解决方案资源管理器中,并且文件系统编辑器打开。
阿新
2018/04/09
2.5K0
开发者openshift4使用入门教程 - 9 - 通过IDE插件无缝衔接
我所在的公司目前使用的K8S是RedHat的OpenShift 4, 虽然有官方文档, 并且有专门的 Develop 章节, 但是实际使用发现, 开发者(特别是中国的开发者, 传统行业\金融行业的开发者)关注的功能和章节相去甚远. 所以我专门针对开发经常问我的问题, 总结出来这个系列文章.
东风微鸣
2022/04/21
3.8K0
开发者openshift4使用入门教程 - 9 - 通过IDE插件无缝衔接
使用Visual Studio Code开发.NET Core看这篇就够了
在本文中,我将带着大家一步一步的通过图文的形式来演示如何在Visual Studio Code中进行.NET Core程序的开发,测试以及调试。尽管Visual Studio Code的部分功能还达不到Visual Studio的水平,但它实际上已经足够强大来满足我们的日常开发。而且其轻量化,插件化以及跨平台的特性则是VS所不具备的。而且Visual Studio Code还可以通过社区来创建一系列的扩展来增强其功能,且社区已经足够活跃。我们可以期待更多很酷的扩展和功能来增强VS Code,这将使在这个轻量级,跨平台编辑器中的开发.NET Core应用程序更加流畅和有趣。赶紧跟着博主一起开始今天的文章吧!
依乐祝
2018/11/12
5.7K0
Visual Studio 2017 15.8 版发行说明
显著提升了在运行包含多个测试项目的大型解决方案期间的性能。 在我们的实验室中,超过 10,000 个 MSTest 的解决方案执行单个测试的速度提高了 82%!
Edi Wang
2019/07/08
8.2K0
Visual Studio 2017 15.8 版发行说明
编写通用 Hello World 驱动程序 (KMDF)
本主题介绍了如何使用内核模式驱动程序框架 (KMDF) 编写非常小的通用 Windows 驱动程序。
战神伽罗
2019/07/24
4.2K0
编写通用 Hello World 驱动程序 (KMDF)
Java中抽象类和接口中可以有构造方法吗?
Java中抽象类和接口中可以有构造方法吗? -----------------------------------------------------------------------------
黑泽君
2018/10/11
2K0
VsCode中使用Jupyter
(以前称为IPython Notebook)是一个开源项目,可让您轻松地在一个名为Notebook的画布上组合Markdown文本和可执行的Python源代码。
云深无际
2020/11/03
6.1K0
VsCode中使用Jupyter
Android Studio 3.6 发布啦,快来围观
Android Studio 3.6 稳定版终于来了,此版本的 Android Studio 包括对一些设计工具的更新,包括布局编辑器和资源管理器。
GSYTech
2020/03/20
9K0
Android Studio 3.6 发布啦,快来围观
Asp.Net MVC4入门指南(7):给电影表和模型添加新字段
在本节中,您将使用Entity Framework Code First来实现模型类上的操作。从而使得这些操作和变更,可以应用到数据库中。 默认情况下,就像您在之前的教程中所作的那样,使用 Entity Framework Code First自动创建一个数据库,Code First为数据库所添加的表,将帮助您跟踪数据库是否和从它生成的模型类是同步的。如果他们不是同步的,Entity Framework将抛出一个错误。这非常方便的在开发时就可以发现错误,否则您可能会在运行时才发现这个问题。 (由一个晦涩的错
葡萄城控件
2018/01/10
2K0
Asp.Net MVC4入门指南(7):给电影表和模型添加新字段
Visual Studio 2008 每日提示(三十五)
#351、在类视图里查看类关系图 原文链接:You can view the Class Diagram for a class from the Class View 操作步骤: 在类视图里,有个查看类关系图的图标按钮 单击这个图标,可以添加一个类的关系模型,或者,如果没有建立关系图就会建立它。 也可以通过“类视图上下文菜单.类视图项.查看类关系图”命令来查看类关系图。 评论:这个功能对系统设计非常有用。 #352、在类视图里调用静态方法 原文链接:You can Invoke a Static
Jianbo
2018/03/01
9590
OpenCV ImageWatch插件安装与使用说明
本文介绍了OpenCV Image Watch插件的安装与使用,该插件可以为图像处理任务提供实时反馈,并支持多种图像格式。作者还分享了在Visual Studio中如何使用该插件进行图像处理任务,包括图像查看、图像监视、图像保存等功能。
chaibubble
2018/01/02
2.6K0
OpenCV ImageWatch插件安装与使用说明
sql数据库打包部署安装
目的:在客户端服务器上”附加数据库文件”。 一).创建部署项目 1. 打开VS.NET2005。 2.在“文件”菜单上指向“新建项目”。 3. 在“新建项目”对话框中,选择“项目类型”窗格中的”其他项
阿新
2018/04/09
2.4K0
sql数据库打包部署安装
Visual Studio Code 1.67调整文件嵌套、Markdown导航
Visual Studio Code 1.67发布于5月5日,可以从项目网站下载,适用于Linux、Windows或Mac。新特性中特别关注的是浏览器文件嵌套和Markdown代码导航。该版本还带来了Java扩展的更新。
小柔
2023/10/14
2910
[经验总结] 在 windows 命令窗
在IDE里面直接执行 cpu.py文件是正常的,正常输出 CPU 信息,但放到命令窗口执行却提示 config 模块不存在
py3study
2020/01/20
5850
Win 平台做 Python 开发的最佳组合:MS Terminal 和 VS Code
使用 Windows 系统一大好处是它的应用太丰富了,甚至强大的 GPU 也能在闲暇时间做点其它「工作」。然而与 Linux 或 macOS 不同,在 Windows 上做开发总会遇到很多挑战,不论是文件编码、环境控制还是项目编译,开发过程中总会有一些神奇的收获。
Python猫
2019/09/25
4.5K0
Win 平台做 Python 开发的最佳组合:MS Terminal 和 VS Code

相似问题

代码映射未出现在Visual Studio 2013中

15

JTable未出现在窗口中

10

图形未出现在窗口中

10

未出现在Visual Studio测试资源管理器中的测试

40

报告查看器未出现在工具箱中- Visual Studio 2017

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文