在联接和LINQ联接中选择所有表的所有列

35

如何使用 Linq 在联接中选取所有表的列

Sql:

select CTRL_RUN_JOB.*, CTRL_DATA_STREAM.*
 from CTRL_RUN_JOB inner join CTRL_DATA_STREAM
      on CTRL_RUN_JOB.DATA_STREAM_ID= CTRL_DATA_STREAM.DATA_STREAM_ID

Linq:

from CTLJCRJOB in CTRL_RUN_JOBs 
join CTLRFDSTM in CTRL_DATA_STREAMs 
on CTLJCRJOB.DATA_STREAM_ID equals CTLRFDSTM.DATA_STREAM_ID
select  new {
         CTLJCRJOB.*  // ???
        ,CTLRFDSTM.*  // ???
}

感谢

4个回答

55

虽然你无法将它们展开为列,但可以简单地返回实体。例如:

select new { CTLJCRJOB, CTLRFDSTM }

如果你需要它被展开,那么你将不得不自己编写映射,但这仍然非常简单。


2
这个方法返回什么类型的查询结果?如何计算返回的查询结果记录数? - rahularyansharma
@rahularyansharma:返回类型取决于情况。在您的情况下,最好将结果存储到列表 toList() 中,然后您可以使用 Count 属性。或者,如果您在查询上调用 Count(),它将执行 Select Count - surfasb
你可以创建一个自定义类来保存 CTLJCRJob 和 CTLRFDSTM,这样你就不必处理返回匿名类型的问题了。 - ruffrey

10
你可以使用into子句,但它不会为你展开它。
from CTLJCRJOB in CTRL_RUN_JOBs 
join CTLRFDSTM in CTRL_DATA_STREAMs 
on CTLJCRJOB.DATA_STREAM_ID equals CTLRFDSTM.DATA_STREAM_ID into ALLCOLUMNS
from entry in ALLCOLUMNS
select entry 

1
另一个转折是:

OutPutList = (from CTLJCRJOB in CTRL_RUN_JOBs 
              join CTLRFDSTM in CTRL_DATA_STREAMs 
                on CTLJCRJOB.DATA_STREAM_ID equals CTLRFDSTM.DATA_STREAM_ID
              select CTLJCRJOB).ToList();

0
你可以使用 into 子句,但它不会为你展开它。
from CTLJCRJOB in CTRL_RUN_JOBs 
join CTLRFDSTM in CTRL_DATA_STREAMs 
on CTLJCRJOB.DATA_STREAM_ID equals 
CTLRFDSTM.DATA_STREAM_ID into ALLCOLUMNS
from entry in ALLCOLUMNS
select entry 

通过这种方式,我们只能得到CTLJCRJOB列的结果,经过我的测试,没有CTLRFDSTM表的列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接