如何为特定方案编写嵌套 LINQ

  • 本文关键字:嵌套 LINQ 方案 c# linq
  • 更新时间 :
  • 英文 :


很抱歉发布一个我无法构建任何可靠内容的问题。 即使在这个网站享有如此高的声誉之后,发布这样的问题对我来说也是非常可耻的。

大多数时候,我在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 中要执行的操作的一个很好的例子。您会发现,如果您了解两件事,则可以轻松完成此操作,甚至更强大的查询:

  1. 不要试图过度地从 SQL 翻译成 Linq。

  2. 拉姆达斯。

第一个很容易理解,但很难执行。某些 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问题中都推荐它们。看看他们。

相关内容

  • 没有找到相关文章

最新更新