【问题标题】:How to query with Linq to Entities with a group by and two counts如何使用 Linq 查询具有 group by 和两个计数的实体
【发布时间】:2013-04-10 18:35:11
【问题描述】:

我需要查询方面的帮助。我想返回一个实体列表,对于每个实体,我需要两个计数。

使用从这些表生成的实体:

    /****** Objet :  Table [dbo].[Messages]    Date de génération du script : 03/12/2013 15:31:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
DROP TABLE [dbo].[Messages]
Go
CREATE TABLE [dbo].[Messages](
    [MessageID] [int] IDENTITY(1,1) NOT NULL,
    [UserCreation] [nvarchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [DateCreation] [datetime] NOT NULL  DEFAULT (getdate()),
    [UserModif] [nvarchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [DateModif] [datetime] NOT NULL  DEFAULT (getdate()),
    [Timestamp] [timestamp] NOT NULL,
    [Notification] [bit] NOT NULL  DEFAULT ((0)),
    [BounceTraite] [bit] NOT NULL  DEFAULT ((0)),
 CONSTRAINT [PK_Messages] PRIMARY KEY CLUSTERED 
(
    [MessageID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
/****** Objet :  Table [dbo].[MessageLocalisations]    Date de génération du script : 03/12/2013 15:31:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
DROP TABLE [dbo].[MessageLocalisations]
Go
CREATE TABLE [dbo].[MessageLocalisations](
    [MessageID] [int] NOT NULL,
    [CodeLocalisation] [char](5) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [From] [nvarchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Subject] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Message] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [TargetedAudience] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 CONSTRAINT [PK_MessageLocalisations] PRIMARY KEY CLUSTERED 
(
    [MessageID] ASC,
    [CodeLocalisation] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
/****** Objet :  Table [dbo].[MessageRecipients]    Date de génération du script : 03/12/2013 15:31:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
DROP TABLE [dbo].[MessageRecipients]
Go
CREATE TABLE [dbo].[MessageRecipients](
    [MessageID] [int] NOT NULL,
    [Recipient] [nvarchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [DateRead] [datetime] NULL,
    [Email] [nvarchar](60) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Bounce] [bit] NOT NULL,
    [DateCreation] [datetime] NOT NULL,
    [DateModif] [datetime] NOT NULL ,
 CONSTRAINT [PK_MessageRecipients] PRIMARY KEY CLUSTERED 
(
    [MessageID] ASC,
    [Recipient] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO

在我的示例中,我的实体是消息。我需要一个收件人的数量和阅读邮件的收件人的数量:

    (From msg In context.Messages.Include("MessageLocalisations")
                         Let countRecipients = msg.MessageRecipients.Count
                         Let countRecipientsRead = msg.MessageRecipients.Where(Function(x) x.DateRead.HasValue).Count
                         Where (msg.UserCreation.Equals(user, StringComparison.OrdinalIgnoreCase))
                         Group By msg.MessageID Into Group
                         Select msg, Group).ToList()

我的例子不起作用。我的选择语句有误,他不认识味精。在 LINQ 中,当我使用 Group By 时,我不确定 Group 的工作方式以及 select 的工作方式。

我想要的结果是一个消息列表,其中包括 MessageLocalisations、每条消息的收件人数量、已阅读每条消息的收件人数量。

感谢您的帮助!在 SQL 中,这很简单...... :(

【问题讨论】:

  • 你能发布你的表定义(创建表语句)吗?
  • 在查询的其余部分中,您甚至在哪里使用了那些 let 语句?
  • 我想在结果中使用它们,以便在 UI 中显示计数。我有可能不需要它们。我完全不喜欢 Linq to Entities。
  • 添加了创建表语句。我不得不在发布之前对其进行一些修改,但我认为它们会正常工作。
  • 这个链接帮助了我。也许我的问题是重复的:[stackoverflow.com/questions/4984337/… [1]:stackoverflow.com/questions/4984337/…

标签: vb.net linq entity-framework linq-to-entities


【解决方案1】:

这是最终解决我问题的查询:

context.MessageSecuriseJeu.Include("MessageSecuriseLocalisations").
                            Where(Function(w) w.UtilisateurCreation.Equals(codeUtilisateurExpediteur, StringComparison.CurrentCultureIgnoreCase)).
                            Select(Function(msg) New With {.msg = msg, .nbrDest = msg.MessageSecuriseDestinataires.Count, .nbrLu = msg.MessageSecuriseDestinataires.Where(Function(w) w.DateLecture.HasValue).Count}).tolist()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多