很抱歉发布一个我无法构建任何可靠内容的问题。 即使在这个网站享有如此高的声誉之后,发布这样的问题对我来说也是非常可耻的。
大多数时候,我在sql server中编写sql in store过程,几乎不使用LINQ。 因此面临为特定场景构造嵌套 LINQ 查询的问题。 只是想知道是否有人可以帮助我或给我提示使用 LINQ 构造此类查询。
在这里,我提供了一个示例SQL查询,我想用LINQ构造相同的SQL查询。
SELECT EmployeeName,
(Select count(*) from table1 where condition) as data1,
(Select count(*) from table1 where condition) as data2,
(Select count(*) from table1 where condition) as data3
虽然我已经从这些 URL 中看到了几个嵌套的 LINQ 示例,但仍然无法弄清楚如何构造我的。
http://odetocode.com/blogs/scott/archive/2007/09/24/nested-selects-in-linq-to-sql.aspx
https://social.msdn.microsoft.com/Forums/en-US/00340c95-221a-4b16-9c47-d1acbf2415dc/linq-nested-select-issue?forum=linqtosql
http://www.mercurynewmedia.com/blog/blog-detail/mercury-new-media-blog/2014/05/19/linq-join-queries-vs-nested-sub-queries
http://www.codethinked.com/the-linq-selectmany-operator
嵌套选择林克查询
http://www.java2s.com/Code/CSharp/LINQ/Nestedquerylist.htm
所以想知道是否有人可以提供帮助。
这是在 Linq 中要执行的操作的一个很好的例子。您会发现,如果您了解两件事,则可以轻松完成此操作,甚至更强大的查询:
-
不要试图过度地从 SQL 翻译成 Linq。
-
拉姆达斯。
第一个很容易理解,但很难执行。某些 Linq 关键字有意类似于 SQL 关键字。Linq 尝试镜像 SQL 的某些方面,但工作方式并不完全相同。一个关键的区别是,对于 Linq,每个函数都会生成一个 Linq 对象(没有双关语),该对象可以传递给另一个 Linq 函数。因此,过滤、转换、聚合等可以按照程序员选择的顺序重复完成。在 SQL 中,单个查询由多个元素(如 WHERE、FROM)构建,其中一些元素是可选的,SQL 引擎决定以哪种顺序评估它们。
获取 LinqPad,并将其用于处理查询和执行数据库查询,而不是在 SSMS 中编写 SQL 代码。当您看到并编写了足够多的 Linq 构造后,您将不再编写音译 SQL,并且您将能够在两者之间来回切换。
其次,确保您了解 lambda。什么作用
x => x + 23
意味 着?它是什么类型?它的参数和返回值的类型是什么?怎么样
(x, y) => x + y * 23
和
() => "Fish"
?
Select
in Linq 将函数作为参数。Select
所做的是最简单的理解 - 它接受输入对象和函数的迭代器,并返回输出对象的迭代器,这些对象是已应用函数的输入对象。这实际上比命名函数更容易理解 lambda。
请记住,C# 中的所有内容都有一个类型。lambda 具有类型,即使该类型不是显式的。错误消息通常会告诉您到底出了什么问题,只是有时它们可能会被误解,并且似乎指向了错误的代码段,而这可能需要非常耗时。将正在编写的代码分解为尽可能小的部分,并在 Linqpad 中调试它们。
你可以走很长的路。尝试在下面查看与您的查询类似的查询建议,看看是否可以在此基础上进行构建。
/* A very simple dataset */
string s = "THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG";
var x = s.Split();
/* The letters list plays the role of your EmployeeName */
var letters = new List<String>{"A", "E", "I", "O", "U"};
var result = letters
.Select(letter => new {letter = letter,
startswith = x.Count(w => w.StartsWith(letter)),
contains = x.Count(w => w.Contains(letter)),
endswith = x.Count(w => w.EndsWith(letter))});
如果您到此为止,您可能希望了解有关 Linq 函数如何在迭代器上运行的更多信息。查看 Jon Skeet 的 Edulinq 系列博客文章:http://codeblog.jonskeet.uk/2011/02/23/reimplementing-linq-to-objects-part-45-conclusion-and-list-of-posts/他重新实现了 Linq 以展示它是如何设计的以及它应该如何工作。
Linqpad和Edulinq以及我所知道的两种最好的编程资源,任何语言,我几乎在我回答的每个Linq问题中都推荐它们。看看他们。