LINQ如何在FROM子句

时间:2016-09-28 00:47:00

标签: c# sql linq nested subquery

Newb to C#.Net / LINQ
我必须将一些动态存储过程转换为LINQ。我是LINQ的新手,正在寻找一个可以效仿的例子。我有以下内容:

sql1 VARCHAR2(32000)  := ' SELECT a,b,c FROM ( ';
from1 VARCHAR2(32000) := ' SELECT x,y,z FROM t1, t2,
                               (SELECT xx FROM aTable WHERE foo = 'bar' )
                            WHERE x=1
                              AND y=2';

无论如何,希望这能得到实例 我希望能做到这样的事情:

var subSelect1 = (from val1 in aTable
                 where  val1.foo = "bar"
                 select new {
                     val1.foobar
                 }).AsEnumerable();

var mainSelect = (from <how do I use the subSelect1 as a virtual table here?>

这在LINQ中是否可行?

实际查询非常冗长而复杂......在主选择的FROM子句中有几个子查询,而FROM中的一些子查询在-their-FROM子句中自己嵌套了子查询。

2 个答案:

答案 0 :(得分:1)

通过一些示例linq查询并查看结果可能会有所帮助。例如,以下代码将创建一个valn的IEnumerable。

var subSelect1 = (from val1 in aTable 
    where  val1.foo = "bar" 
);

注意以上内容等同于以下内容。

var subSelect1 = (from val1 in aTable 
    where  val1.foo = "bar" 
    select val1 /* this select statement is implied in the above */
);

在where子句之后添加select new {val1.foobar}会创建一个匿名类型的IEnumerable,其中一个属性名为foobar。这意味着您只能加入一个foobar属性。

var subSelect1 = (from val1 in aTable
         where  val1.foo == "bar"
         select new {val1.foobar}
    );

var mainSelect = (from f in subSelect1
         where f.foobar == "test")

通过省略select new,您将可以访问val1中的所有字段。

var subSelect1 = (from val1 in aTable 
    where  val1.foo == "bar" 
);

var mainSelect = (from v in subSelect1
    where v.foobar == "test"
        and v.bar == "status"
)

答案 1 :(得分:1)

我对您的确切requirement不是很清楚,但我的理解是您需要一个链式Linq Query,以便可以使用Subquery结果过滤父数据。此外,Fluent语法是IEnumerable<T>上的一组扩展方法,因此DataTable需要调用AsEnumerable(),以便可以在IEnumerable<DataRow>上执行操作,然后在{{{}}上执行操作可以调用CopyToDataTable中的1}}进行重新转换。此外,由于我们正在处理System.Data.DataSetExtensions,因此价值访问需要DataRows,例如indexerdataRow["ColumnName"]

// dataRow[ColumnIndex]dr类型(获取所有数据行,而不是像DataRow这样的特定列

  

创建Subselect1 foobar

IEnumerable<DataRow>
  

var subSelect1 = aTable.AsEnumerable() .Where(dr => dr["foo"] == "bar")

这应该很简单,具体取决于您需要做什么我假设,您需要匹配var mainSelect = (from <how do I use the subSelect1 as a virtual table here?中存在的DataRows,然后如下所示:

subSelect1

理念仍然存在,在Linq中创建复杂的链式查询非常简单,前提是您确切知道自己需要什么,这在问题中不是很清楚