我正在使用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))
这可能吗?
答案 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。