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子句中自己嵌套了子查询。
答案 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
,例如indexer
或dataRow["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中创建复杂的链式查询非常简单,前提是您确切知道自己需要什么,这在问题中不是很清楚