EF Core中的表值函数

Jos*_*rke 5 entity-framework .net-core

我正在使用EF Core 1.1并且有一个类似的查询

var list=from l in context.Users
         where l.SomeProp==someVal
         select l;
Run Code Online (Sandbox Code Playgroud)

我有一个返回Id的表的UDF,我基本上想要生成以下查询:

select * from Users where SomeProp=@someVal and SomeId in (select id from fn_myfunc(@id))
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Dav*_*idG 7

我认为您只能对数据库运行原始SQL查询,以便能够使用表值函数.例如:

var query = @"SELECT * FROM Users WHERE SomeProp = {0} 
                AND SomeId IN (SELECT id FROM fn_myfunc({1})";

var users = context.Users
    .FromSql(query, someProp, someId)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

这种方法有一些局限性.来自文档:

  • SQL查询只能用于返回属于模型的实体类型.我们的待办事项上有一项增强功能,可以从原始SQL查询中返回特殊类型.
  • SQL查询必须返回实体类型的所有属性的数据.
  • 结果集中的列名必须与属性映射到的列名匹配.请注意,这与EF6.x不同,其中对于原始SQL查询忽略属性/列映射,并且结果集列名必须与属性名称匹配.
  • SQL查询不能包含相关数据.但是,在许多情况下,您可以使用Include运算符在查询之上进行组合以返回相关数据.

您可以返回相关数据(即Include),如下所示:

var users = context.Users
    .FromSql(query, someProp, someId)
    .Include(u => u.OtherThings)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

如果您需要执行更复杂的操作,则需要使用原始数据访问(如ADO.Net)或其他ORM.我知道那些使用EF Core进行大部分工作的人然后偶尔会进入Dapper以获得性能或不适合EF的原始SQL.

  • 感谢您提供完美解决方案 (2认同)