C# 具有字符串连接的Linq到实体子查询

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

我正在尝试将我编写的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
        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();