EF Core中的表值函数

时间:2017-07-13 14:48:12

标签: entity-framework .net-core

我正在使用EF Core 1.1,并且有一个类似

的查询
var list=from l in context.Users
         where l.SomeProp==someVal
         select l;

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

select * from Users where SomeProp=@someVal and SomeId in (select id from fn_myfunc(@id))

这可能吗?

1 个答案:

答案 0 :(得分: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();

此方法存在一些限制。来自the docs

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

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

var users = context.Users
    .FromSql(query, someProp, someId)
    .Include(u => u.OtherThings)
    .ToList();

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