SQL:嵌套查询没有适当的键

时间:2016-11-18 22:01:57

标签: c# sql-server linq

在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进行比较

1 个答案:

答案 0 :(得分:0)

不要使用LINQ加入表,它无效。

您需要将所有已连接的函数包含到[dbo]。[search]表值函数(如视图)中。然后从EF调用[dbo]。[search]并过滤它。

mentioned在这里加入了全文表值函数。

请注意,全文并在一个查询中一起过滤可能需要一些时间,因为查询优化器并不容易。查询优化器选择在整个表上执行第一个全文,然后以相反的方式进行过滤。