在LINQ中,我正在尝试为全文搜索和Iqueryable结果编写内部联接自定义函数。
但是,当我尝试to_ret.select(--something--).ToList()
嵌套查询没有适当的密钥
LINQ代码:
var sql_query = db.search(st);
var to_ret = from ts in sql_query
from t in table
where t.Id == ts.Value select t;
to_ret = to_ret.Include(x => x.table1)
.Include(x=> x.table2.Select(y=> y.table2Col));
to_ret.select(-something-).toList();
SQL代码:
create function [dbo].[search]
(@keywords nvarchar(4000))
returns table
as
return (
select [key] from containstable(tb,(Name,Description),@keywords)
)
代替上述LINQ代码的代码:
var ids = (from t in table join ts in db.search(st) on t.Id equals ts.Value select t.Id).ToList();
to_ret = to_ret.Where(x => ids.Contains(x.Id));
但是,有效的代码效率不高,因为它急切地加载所有ids
进行比较
答案 0 :(得分:0)
不要使用LINQ加入表,它无效。
您需要将所有已连接的函数包含到[dbo]。[search]表值函数(如视图)中。然后从EF调用[dbo]。[search]并过滤它。
我mentioned在这里加入了全文表值函数。
请注意,全文并在一个查询中一起过滤可能需要一些时间,因为查询优化器并不容易。查询优化器选择在整个表上执行第一个全文,然后以相反的方式进行过滤。