首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将此linq缩短为sql查询?

如何将此linq缩短为sql查询?
EN

Stack Overflow用户
提问于 2010-01-04 21:12:01
回答 2查看 383关注 0票数 1

我正在做一个日历,为了让自己更容易,我打破了跨越数周的约会。

例如,1月1日至1月31日的时间跨度约为6周(我的日历总是42个单元-6乘7)。因此,我基本上可以将6行存储在我的数据库中。

但是,有些事情我确实要求我把所有这些行重新组合到一行中。例如,如果我想导出我的日历格式。

我的数据库中有一个名为bindingClassName的字段,所有这些行对这组任务都有相同的unquie,所以我能够轻松地获得所有的周。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// get all of the task rows by binding class name.
            var found = plannerDb.Calendars.Where(u => u.UserId == userId && u.BindingClassName == bindingClassName)
                .GroupBy(u => u.BindingClassName);



            List<Calendar> allAppoingments = new List<Calendar>();

            // go through each of the results and add it to a list of calendars
            foreach (var group in found)
            {

                foreach (var row in group)
                {

                    Calendar appointment = new Calendar();
                    appointment.AppointmentId = row.AppointmentId;
                    appointment.AllDay = row.AllDay;
                    appointment.BindingClassName = row.BindingClassName;
                    appointment.Description = row.Description;
                    appointment.EndDate = row.EndDate;
                    appointment.StartDate = row.StartDate;
                    appointment.Title = row.Title;
                    appointment.Where = row.Where;
                    appointment.UserId = row.UserId;

                    allAppoingments.Add(appointment);
                }
            }
            // order 
           var test = allAppoingments.OrderBy(u => u.StartDate);

           var firstAppointment = test.First();
           var LastAppointment = test.Last();

           Calendar newAppointment = new Calendar();
           newAppointment.UserId = firstAppointment.UserId;
           newAppointment.Description = firstAppointment.Description;
           newAppointment.AllDay = firstAppointment.AllDay;
           newAppointment.StartDate = firstAppointment.StartDate;
           newAppointment.Title = firstAppointment.Title;
           newAppointment.Where = firstAppointment.Where;
           newAppointment.BindingClassName = firstAppointment.BindingClassName;
           newAppointment.EndDate = LastAppointment.EndDate;

            return newAppointment;

因此,基本上,这个大blob可以找到所有具有相同绑定名称的约会。然后,我遍历每一个,并将其变成一个Calendar对象,最后,一旦全部完成,我将获得第一条也是最后一条记录,以获得startDate和endDate。

所以我对linq不太在行,但是我不确定我是否可以在groupBy之后添加一些东西来做我想做的事情。

编辑

一旦我从用户那里得到所有的约会,我就尝试将所有的约会组合在一起。

所以到目前为止我有这个

我试过这样的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    var allApointments = calendar.GetAllAppointments(userId);
    var group = allApointments.GroupBy(u => u.BindingClassName).Select(u => new Calendar()).ToList

我本来希望它能自动填充每一组,但它没有。所以我不确定是否不需要再来一次。

编辑@ admin

嗨,谢谢你解释分类和分组。你是怎么解释这件事的,尽管看上去这两种方法都管用。

就像你得到第一次和最后一次约会的代码一样,效果很好,做了我想做的事情。

我认为分组可能是有效的,因为最终,尽管我希望有一行具有第一条记录的开始日期和最后一条记录的结束日期,但所有其他信息都是相同的。

因此,我不知道是否会更难写代替或什么,但就像我说的,你的查询做我想做的。

但是,该查询是在单一基础上使用的。就像我只在用户单击查看日历上的约会时才使用该查询一样。通过单击约会,我可以获得有关该约会的所有信息,这是我需要查看任务是否跨越多天的地方,并确定约会何时开始和何时结束。

现在,我需要另一个查询,我认为如果我能够根据您的解释对它们进行分组,就更好了,它将产生一行。我认为这是因为我想从那个用户导出表中的所有记录。

因此,如果我按绑定名称将它们排序为一个连续块,我仍然需要一些循环,这些循环遍历所有记录,获取第一个和开始日期。所以,如果我能一次把它分组,最后的结果将是每组绑定名称的一个记录,它将有第一个开始日期和第一个和最后一个记录的最后结束日期会更好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-04 21:24:18

如果没有实际使用组,为什么要将约会分组?看起来你只是在单独使用它们。在任何情况下,您都已经在筛选BindingClassName子句中单个值上的行,因此最终只能得到1(或0)组。

您可以将这一系列foreach循环重写为SelectToList(),如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var allAppointments = 
    plannerDb.Calendars.Where(
    row => row.UserId == userId && 
           row.BindingClassName == bindingClassName).OrderBy(
    row => row.StartDate).Select(
    row => new Calendar()
    {
        AppointmentId = row.AppointmentId,
        AllDay = row.AllDay,
        BindingClassName = row.BindingClassName,
        Description = row.Description,
        EndDate = row.EndDate,
        StartDate = row.StartDate,
        Title = row.Title,
        Where = row.Where,
        UserId = row.UserId
    }).ToList();

这会按你想要的顺序把完整的清单还给你。然而,我很好奇,当你看起来只对第一次和最后一次约会感兴趣的时候,你为什么要检索整个列表。你可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var baseQuery = 
        plannerDb.Calendars.Where(
        row => row.UserId == userId && 
               row.BindingClassName == bindingClassName);

var first = baseQuery.OrderBy(row => row.StartDate).First();
var last = baseQuery.OrderByDescending(row => row.StartDate).Select(
           row => row.EndDate).First();

return new Calendar()
{
    AppointmentId = first.AppointmentId,
    AllDay = first.AllDay,
    BindingClassName = first.BindingClassName,
    Description = first.Description,
    EndDate = last,
    StartDate = first.StartDate,
    Title = first.Title,
    Where = first.Where,
    UserId = first.UserId
});

这将产生与现在相同的输出。不过,如果这正是你想要的,我会提出疑问。假设你有两个约会:

  • 第一任由一月五日起至一月十日结束
  • 委任2由一月六日起至一月七日止

使用这个(和您的)逻辑,您将获得1月7日的结束日期,因为约会2有更大的开始日期,但约会1实际上在稍后结束。我建议将第二个查询改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var last = baseQuery.OrderByDescending(row => row.EndDate).Select(
           row => row.EndDate).First();

这将给你最大的结束日期,我认为这是你真正想要的。

编辑

我认为你犯了(非常常见的)错误,把分组和排序混淆在一起。当您说要“根据绑定名称对约会进行分组”时,听起来您需要一个完整的约会列表,并且您希望这些约会的安排方式是,所有具有特定绑定名称的约会都形成一个连续块。如果是这样的话,您希望按照绑定名称来排序列表,而不是对它们进行分组。分组使用整个列表并生成每组一行的子句,并允许您对其余的列执行聚合功能。例如,假设我根据绑定名称对约会进行分组。这意味着我的结果集将包含每一个绑定名称的一行,然后我可以执行类似于查找最大开始日期或结束日期之类的事情;更正式地说,您可以指定聚合操作,这是接受一组数据(即开始日期列表)并返回单个数据(即最大开始日期)的操作。

除非我误解了,听起来你仍然想要检索所有的个人作业,你只是想要它们按绑定名称排列。如果是这样的话,只要OrderBy(row => row.BindingName)就行了。此外,您可能希望避免使用“组”一词,因为人们会认为您指的是我前面描述的那种分组。

票数 4
EN

Stack Overflow用户

发布于 2010-01-06 04:48:53

作为一个不涉及linq的侧重点,您看过AutoMapper吗?我目前正在使用它来填充linq中的数据对象,我发现它对于摆脱只映射到dtos的大量代码非常有用。它不会使代码的查询部分变得更短,但会减少:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return new Calendar()
{
    AppointmentId = first.AppointmentId,
    AllDay = first.AllDay,
    BindingClassName = first.BindingClassName,
    Description = first.Description,
    EndDate = last,
    StartDate = first.StartDate,
    Title = first.Title,
    Where = first.Where,
    UserId = first.UserId
});

至:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return Mapper.Map(first,new Calendar{EndDate = last});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2004291

复制
相关文章
Hive 视图和索引
Hive 中的视图和 RDBMS 中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条 SELECT 语句的结果集。视图是纯粹的逻辑对象,没有关联的存储 (Hive 3.0.0 引入的物化视图除外),当查询引用视图时,Hive 可以将视图的定义与查询结合起来,例如将查询中的过滤器推送到视图中。
每天进步一点点
2022/12/15
1.4K0
Hive 视图和索引
SQL Server 索引和视图
索引(Index)是数据库中一种用于加速对表中数据的检索速度的数据结构。索引类似于书籍的目录,它提供了一种快速查找数据行的方法,避免了全表扫描的开销。通过使用索引,数据库系统可以直接定位到符合特定搜索条件的数据,而不必逐行遍历整个表。
神秘泣男子
2024/06/03
1140
SQL Server 索引和视图
事务、视图、索引、备份和恢复
创建视图:CREATE VIEW view_name AS <SELECT 语句>;
小陈运维
2021/10/13
3570
数据库:视图和索引
视图是一张虚拟表,并不在数据库中以存储数据值集的形式存在。在引用过程中依据基表动态生成。
全栈程序员站长
2022/09/16
6310
视图索引
大家好,又见面了,我是你们的朋友全栈君。创建索引视图 视图也称为虚拟表,这是因为由视图返回的结果集其一般格式与由列和行组成的表相似,并且,在 SQL 语句中引用视图的方式也与引用表的方式相同。标准视图的结果集不是永久地存储在数据库中。查询每次引用视图时,Microsoft&reg; SQL Server&#8482; 2000 会动态地将生成视图结果集所需的逻辑合并到从基表数据生成完整查询结果集所需的逻辑中。生成视图结果的过程称为视图具体化。有关更多信息,请参见视图解析。 对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别是对于那些涉及对大量行进行复杂处理(如聚合大量数据或联接许多行)的视图更为可观。若经常在查询中引用这类视图,可通过在视图上创建唯一聚集索引来提高性能。在视图上创建唯一聚集索引时将执行该视图,并且结果集在数据库中的存储方式与带聚集索引的表的存储方式相同。有关用于存储聚集索引的结构的更多信息,请参见聚集索引。 说明 只有安装了 Microsoft SQL Server 2000 企业版或 Microsoft SQL Server 2000 开发版,才可以创建索引视图。 在视图上创建索引的另一个好处是:查询优化器开始在查询中使用视图索引,而不是直接在 FROM 子句中命名视图。这样一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益。有关更多信息,请参见在视图上使用索引。 在视图上创建聚集索引可存储创建索引时存在的数据。索引视图还自动反映自创建索引后对基表数据所做的更改,这一点与在基表上创建的索引相同。当对基表中的数据进行更改时,索引视图中存储的数据也反映数据更改。视图的聚集索引必须唯一,从而提高了 SQL Server 在索引中查找受任何数据更改影响的行的效率。 与基表上的索引相比,对索引视图的维护可能更复杂。只有当视图的结果检索速度的效益超过了修改所需的开销时,才应在视图上创建索引。这样的视图通常包括映射到相对静态的数据上、处理多行以及由许多查询引用的视图。 视图的要求 在视图上创建聚集索引之前,该视图必须满足下列要求: 当执行 CREATE VIEW 语句时,ANSI_NULLS 和 QUOTED_IDENTIFIER 选项必须设置为 ON。OBJECTPROPERTY 函数通过 ExecIsAnsiNullsOn 或 ExecIsQuotedIdentOn 属性为视图报告此信息。 为执行所有 CREATE TABLE 语句以创建视图引用的表,ANSI_NULLS 选项必须设置为 ON。 视图不能引用任何其它视图,只能引用基表。 视图引用的所有基表必须与视图位于同一个数据库中,并且所有者也与视图相同。 必须使用 SCHEMABINDING 选项创建视图。SCHEMABINDING 将视图绑定到基础基表的架构。 必须已使用 SCHEMABINDING 选项创建了视图中引用的用户定义的函数。 表和用户定义的函数必须由 2 部分的名称引用。不允许使用 1 部分、3 部分和 4 部分的名称。 视图中的表达式所引用的所有函数必须是确定性的。OBJECTPROPERTY 函数的 IsDeterministic 属性报告用户定义的函数是否是确定性的。有关更多信息,请参见确定性函数和非确定性函数。 视图中的 SELECT 语句不能包含下列 Transact-SQL 语法元素: 选择列表不能使用 * 或 table_name.* 语法指定列。必须显式给出列名。 不能在多个视图列中指定用作简单表达式的表的列名。如果对列的所有(或只有一个例外)引用是复杂表达式的一部分或是函数的一个参数,则可多次引用该列。例如,下列选择列表是非法的: SELECT ColumnA, ColumnB, ColumnA 下列选择列表是合法的: SELECT ColumnA, AVG(ColumnA), ColumnA + Column B AS AddColAColB SELECT SUM(ColumnA), ColumnA % ColumnB AS ModuloColAColB 派生表。 行集函数。 UNION 运算符
全栈程序员站长
2022/09/16
1.2K0
数据库视图和索引
虚拟视图是由其他其他关系上的查询所定义的一种关系。虚拟视图并不在数据库中存储,但可对其进行查询,就好像它被存储在数据库中一样。查询处理器会在执行查询时用视图的定义来替换视图。 试图也可以被物化,即它们从数据库中定期的进行构造并存储。物化可以加快查询的执行,一种典型的“物化视图”就是索引。 虚拟视图 视图定义 CREATE VIEW <视图名> AS <视图定义>; 例如:有个关系如下: Movies(title, year, length, name, producer) 要在其上创建一个视图,包括2018
SuperHeroes
2018/05/31
1.3K0
视图和索引(数据库学习)
引入—数据库的基本表是按照数据库设计人员的观点设计的,并不一定符合所有用户的需求。
营琪
2019/11/04
1.1K0
mysql创建索引视图_mysql中创建视图、索引[通俗易懂]
视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。
全栈程序员站长
2022/09/16
7.7K0
索引与视图
一个多列索引可以认为是包含通过合并(concatenate)索引列值创建的值的一个排序数组。 当查询语句的条件中包含last_name 和 first_name时
全栈程序员站长
2022/09/16
3260
视图索引问题
  最近和一直在研究如何加快查询数据库的速度,看了网络上说用索引,会加快查询的速度.我就认真看了索引了一些文章,也建立了表索引.但是在建立视图索引的时候遇到问题了, 无法在视图 ‘SBK_VIEW’ 上创建 索引,因为该视图未绑定到架购.查一下相关的资料,发现:
全栈程序员站长
2022/09/16
4220
Oracle 视图索引
注:为了在当前用户模式中创建视图,要求数据库用户必须有create any view(创建任何视图)的权限。
全栈程序员站长
2022/09/16
1.3K0
Oracle 视图索引
solr合并索引
solr下可以通过mergeindexes命令完成一个或多个core到其他core的索引合并,合并索引需要保证要被合并到的core的schema要与其他来源core的schema兼容,否则就会出现无法启动core的问题,我们可以通过代码CoreAdminRequest.MergeIndexes类实现,实例代码如下:
johnhuster的分享
2022/03/28
5270
【iOS 开发】父视图外部子视图点击响应 - hitTest
面试被问过两次了的一个问题,记录一下:假如一个 UIView(我们称作 FatherView),有一个 subview(我们称作 ChildView),这个 ChildView 在 FatherView 的 frame 外部,那么默认情况下,这个 ChildView 被点击的时候,并不会触发 FatherView 的点击响应链(这是合情合理的,FatherView 所在的位置都没被点击,它不遍历 subviews,不作回应是正常的),这时候怎样才能让这个 ChildView 相应点击事件?
KyXu
2019/04/11
1.1K0
【iOS 开发】父视图外部子视图点击响应 - hitTest
【MySQL】表的内外连接和视图
内连接实际上就是利用 where 子句对两种表形成的笛卡尔积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。
YoungMLet
2024/03/01
1840
【MySQL】表的内外连接和视图
MySQL中的索引、视图和DBA操作
索引就相当于一本书的目录,通过目录可以快速地找到对应的资源。在数据库方面,查询一张表的时候有两种检索方式:
共饮一杯无
2022/11/28
1.1K0
hive之路9-hive索引和视图
本文中主要是介绍了hive中索引和视图的相关操作。 修改表 修改表主要是对表的结构和属性进行操作,包含: 重命名 alter table oldname rename to new_table; 修改表属性 alter table table_name set tblproperties (property_name=property_value); 修改表注释 alter table table_name set tblproperties('comment'=new_comment); 修改存储属
皮大大
2021/03/02
7340
SQLServer中使用索引视图(物化视图)
物化视图:以前用的普通的视图,普通视图就是一段逻辑语句,对性能没有任何的提升,也不能创建索引,而物化视图会把视图里查询出来的数据在数据库上建立快照,它和物理表一样,可以创建 索引,主键约束等等,性能会有质的提升,但是其有缺点,会占用,可以设置它定时自动更新一次,也可以手动更新,当然也是可以设置及时更新的,但是会拉慢基表的增删改查操作,在这里我只讲思路,具体的话大家可以自己去研究。
跟着阿笨一起玩NET
2018/09/19
3.3K0
mysql之视图、索引
视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。
全栈程序员站长
2022/09/16
9860
sqlserver 视图创建索引_Oracle创建索引
1、添加索引 create index 索引对象名 on 索引对应表名(表内索引对象字段名); 例:需创建包含userid属性的userinfo表。 create index userid on system.userinfo(userid);
全栈程序员站长
2022/10/04
1.3K0
sqlserver 视图创建索引_数据库视图可以建立索引吗
视图(View)是从一个或多个表或其它视图导出的,用来导出视图的表称为基表,导出的视图又称为虚表。在数据库中,只存储视图的定义,不存放视图对应的数据,这些数据仍然存放在原来的基表中。 使用视图前,必须先创建视图,创建视图要遵守以下原则: (1)只有在当前数据库中才能创建视图,视图命名必须遵循标识符规则。 (2)不能将规则、默认值或触发器与视图相关联。 (3)不能在视图上建立任何索引。
全栈程序员站长
2022/09/23
2.8K0
sqlserver 视图创建索引_数据库视图可以建立索引吗

相似问题

使用完全外部联接对视图进行索引优化

10

完全外部连接减慢查询

20

无法运行完全外部连接

10

oracle数据库过滤器与完全外部连接和合并相交

10

外部连接抑制索引使用?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文