【发布时间】:2015-07-21 17:44:41
【问题描述】:
我正在寻求有关特定 Linq 连接查询的帮助。我的 Linq 知识相当基础,我整天都在努力编写正确的连接代码。
我实际上是在尝试使用由 CrmSvcUtil.exe 实用程序生成的 ServiceContext 构建一个可以与 Dynamics CRM Online 2015 SDK 一起使用的 Linq 查询。
显然,CRM Linq Provider 存在限制(ref1、ref2、ref3 等)。当使用我熟悉的那种 Linq 查询时,我经常会收到以下错误。似乎答案是使用更自然的 Linq 连接。
Invalid 'where' condition. An entity member is invoking an invalid property or method.
与其向您展示我的 100 多次失败尝试,我认为最好使用 SQL 示例来展示我正在尝试实现的目标。下面的示例脚本。本质上,我有一个实体,我想为其返回记录列表。这与另一个实体有两个 N:N 关系。我想返回与一个 N:N 关系中的给定 ID 相关联的主实体的所有实例,而不是与另一个 N:N 关系中的相同 ID 相关联。
我最苦恼的部分是执行一个包含内连接和左外连接的 Linq 查询。即使您没有直接使用 CRM Linq 提供程序的经验,它仍然可以帮助我了解如何在 Linq 中正常完成。非常感谢所有帮助。
我想用 Linq 构建的 SQL 查询:
DECLARE @id INT = 1
-- Should only return entities with IDs 1 and 2
SELECT a.* FROM [dbo].[MainEntity] a
INNER JOIN [dbo].[AltOne] b ON a.EntityID = b.EntityID AND b.AltOneID = @id
LEFT JOIN [dbo].[AltTwo] c ON a.EntityID = c.EntityID AND c.AltOneID = @id
WHERE c.AltOneID IS NULL
数据库设置脚本:
CREATE TABLE [dbo].[MainEntity](
[EntityID] [int] NOT NULL,
[EntityName] [varchar](50) NOT NULL,
CONSTRAINT [PK_MainEntity] PRIMARY KEY CLUSTERED
(
[EntityID] ASC
)
)
GO
CREATE TABLE [dbo].[AltOne](
[EntityID] [int] NOT NULL,
[AltOneID] [int] NOT NULL,
CONSTRAINT [PK_AltOne] PRIMARY KEY CLUSTERED
(
[EntityID] ASC,
[AltOneID] ASC
)
)
GO
ALTER TABLE [dbo].[AltOne] WITH CHECK ADD CONSTRAINT [FK_AltOne_MainEntity] FOREIGN KEY([EntityID])
REFERENCES [dbo].[MainEntity] ([EntityID])
GO
ALTER TABLE [dbo].[AltOne] CHECK CONSTRAINT [FK_AltOne_MainEntity]
GO
CREATE TABLE [dbo].[AltTwo](
[EntityID] [int] NOT NULL,
[AltOneID] [int] NOT NULL,
CONSTRAINT [PK_AltTwo] PRIMARY KEY CLUSTERED
(
[EntityID] ASC,
[AltOneID] ASC
)
)
GO
ALTER TABLE [dbo].[AltTwo] WITH CHECK ADD CONSTRAINT [FK_AltTwo_MainEntity] FOREIGN KEY([EntityID])
REFERENCES [dbo].[MainEntity] ([EntityID])
GO
ALTER TABLE [dbo].[AltTwo] CHECK CONSTRAINT [FK_AltTwo_MainEntity]
GO
INSERT INTO [dbo].[MainEntity] ([EntityID], [EntityName]) VALUES (1, 'Test 1')
INSERT INTO [dbo].[MainEntity] ([EntityID], [EntityName]) VALUES (2, 'Test 2')
INSERT INTO [dbo].[MainEntity] ([EntityID], [EntityName]) VALUES (3, 'Test 3')
GO
INSERT INTO [dbo].[AltOne] ([EntityID], [AltOneID]) VALUES (1, 1)
INSERT INTO [dbo].[AltOne] ([EntityID], [AltOneID]) VALUES (1, 2)
INSERT INTO [dbo].[AltOne] ([EntityID], [AltOneID]) VALUES (2, 1)
INSERT INTO [dbo].[AltOne] ([EntityID], [AltOneID]) VALUES (2, 2)
INSERT INTO [dbo].[AltOne] ([EntityID], [AltOneID]) VALUES (3, 1)
GO
INSERT INTO [dbo].[AltTwo] ([EntityID], [AltOneID]) VALUES (3, 1)
INSERT INTO [dbo].[AltTwo] ([EntityID], [AltOneID]) VALUES (1, 2)
INSERT INTO [dbo].[AltTwo] ([EntityID], [AltOneID]) VALUES (2, 2)
GO
编辑 1:
根据要求添加示例类。重申一下,我需要返回MainEntity 对象的集合而不直接使用其ICollection 属性,而是使用连接(这似乎是CRM Linq 提供程序的限制)。该列表必须是不通过CollectionOne与特定RelatedEntity相关,但通过CollectionTwo与同一RelatedEntity相关的对象。我希望这很清楚。
public class MainEntity
{
public int EntityID { get; set; }
public string EntityName { get; set; }
public ICollection<RelationshipOne> CollectionOne { get; set; }
public ICollection<RelationshipTwo> CollectionTwo { get; set; }
}
public class RelationshipOne
{
public int EntityID { get; set; }
public int AltOneID { get; set; }
public ICollection<MainEntity> MainEntities { get; set; }
public ICollection<RelatedEntity> RelatedEntities { get; set; }
}
public class RelationshipTwo
{
public int EntityID { get; set; }
public int AltOneID { get; set; }
public ICollection<MainEntity> MainEntities { get; set; }
public ICollection<RelatedEntity> RelatedEntities { get; set; }
}
public class RelatedEntity
{
public int RelatedEntityID { get; set; }
public string RelatedEntityName { get; set; }
public ICollection<RelationshipOne> RelationshipOnes { get; set; }
public ICollection<RelationshipTwo> RelationshipTwos { get; set; }
}
public class DummyContext
{
public System.Data.Entity.DbSet<MainEntity> MainEntitySet { get; set; }
public System.Data.Entity.DbSet<RelationshipOne> RelationshipOneSet { get; set; }
public System.Data.Entity.DbSet<RelationshipTwo> RelationshipTwoSet { get; set; }
public System.Data.Entity.DbSet<RelatedEntity> RelatedEntitySet { get; set; }
}
【问题讨论】:
-
可以添加类建模吗?
-
正如我所说,我的现实生活挑战与巨大的自动生成的 CRM 类模型有关。你是要那些,还是只需要一些类来配合我的简单 SQL 示例?
-
只是示例中的类
标签: c# asp.net linq dynamics-crm-2015