C# 具有字符串连接的Linq到实体子查询
我正在尝试将我编写的SQL查询转换为等效的LINQtoEntities查询。它有一个子查询,将两个字段连接在一起,然后用作我需要连接的字段 SQL:C# 具有字符串连接的Linq到实体子查询,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,我正在尝试将我编写的SQL查询转换为等效的LINQtoEntities查询。它有一个子查询,将两个字段连接在一起,然后用作我需要连接的字段 SQL: select distinct ta.Filename from TableA ta inner join ( SELECT distinct isnull(tb.StringField,convert(varchar,tc.IntField) + convert(varchar,tb.IntFieldB)) as NewNames
select distinct ta.Filename
from TableA ta
inner join (
SELECT distinct isnull(tb.StringField,convert(varchar,tc.IntField) + convert(varchar,tb.IntFieldB)) as NewNames
FROM TableB tb
inner join TableC tc
on tb.fkC = tc.ID
) tj
on tj.NewNames = ta.Filename
以下是我当前的Linq查询,但我知道它不正确。林克:
由于子查询中创建的匿名类型,它会抱怨
包含的。正确的方法是什么?您可以尝试使用任何扩展方法:
var query = (from ta in ef.TableA
where (from tb in ef.TableB
from tc in ef.TableC
.Where(tc => tc.ID == tb.fkC)
select new { NewNames = tb.StringField ?? SqlFunctions.StringConvert((double)tc.IntField) + SqlFunctions.StringConvert((double)tb.IntField2)}
).Any(e.NewNames==ta.Filename)
select ta.Filename
).Distinct().OrderBy(ta => ta.Filename).ToList();
或者,您可以仅使用连接操作后获得的字符串来投影内部查询:
var query = (from ta in ef.TableA
where (from tb in ef.TableB
from tc in ef.TableC
.Where(tc => tc.ID == tb.fkC)
select (tb.StringField ?? SqlFunctions.StringConvert((double)tc.IntField) + SqlFunctions.StringConvert((double)tb.IntField2))
).Contains(ta.Filename)
select ta.Filename
).Distinct().OrderBy(ta => ta.Filename).ToList();
更新
我认为以下内容可以稍微改进您的查询:
var query = (from ta in ef.TableA
where (from tb in ef.TableB
join tc in ef.TableC on tb.fkC equals tc.Id
where (tb.StringField ?? SqlFunctions.StringConvert((double)tc.IntField) + SqlFunctions.StringConvert((double)tb.IntField2))==ta.Filename
select tb).Any()
select ta.Filename
).Distinct().OrderBy(ta => ta.Filename).ToList();
使用类似于
的如何?我仍然收到了一个关于Any
的错误,但是第二种方法似乎可以工作。但是,我得到了超时错误,因为表太大,无法创建有效的查询。它最后执行一个子查询,从TableA中选择所有内容,TableA有很多记录。即使我翻转查询,从TableB(B join C join A)开始,只在StringField=Filename上进行连接(忽略可能的空情况),它仍然会这样做。@wham12,我添加了一个新的查询,试图提高效率。让我知道它是否有效。遗憾的是,它仍然作为子查询选择完整的表。我想我必须将我的SQL查询保存为一个存储过程,并通过EF调用它。是的,我认为这是一个好主意,对于SP,您还可以避免使用SqlFunctions
,这也会影响性能。
var query = (from ta in ef.TableA
where (from tb in ef.TableB
join tc in ef.TableC on tb.fkC equals tc.Id
where (tb.StringField ?? SqlFunctions.StringConvert((double)tc.IntField) + SqlFunctions.StringConvert((double)tb.IntField2))==ta.Filename
select tb).Any()
select ta.Filename
).Distinct().OrderBy(ta => ta.Filename).ToList();