PetaPoco.默认情况下,获取多对一的关系扩展会给我不想要的子节点

本文关键字:我不想 子节点 扩展 关系 情况下 获取 多对一 PetaPoco 默认 | 更新日期: 2023-09-27 17:50:11

例如,我有两个表:

CREATE TABLE [dbo].[Parent](
    [Id] [int] NOT NULL,
    [Name] [nvarchar](50) NOT NULL
) ON [PRIMARY]
GO
BEGIN TRANSACTION;
INSERT INTO [dbo].[Parent]([Id], [Name])
SELECT 1, N'First parent' UNION ALL
SELECT 2, N'Second parent' UNION ALL
SELECT 3, N'Parent with no childrens'
COMMIT;
CREATE TABLE [dbo].[Child](
    [Id] [int] NOT NULL,
    [ParentId] [int] NOT NULL,
    [Name] [nvarchar](50) NOT NULL
) ON [PRIMARY]
GO
BEGIN TRANSACTION;
INSERT INTO [dbo].[Child]([Id], [ParentId], [Name])
SELECT 1, 1, N'First child' UNION ALL
SELECT 2, 2, N'Second child'
COMMIT;
然后是两个c#类,如
public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Child> Children { get; set; }
}
public class Child
{
    public int Id { get; set; }
    public int ParentId { get; set; }
    public string Name { get; set; }
}

当我使用Petapoco和关系扩展(其中db是Petapoco数据库对象的实例):

var parents = db.FetchOneToMany<Parent, Child>(p => p.Id, "SELECT * FROM Parent AS p LEFT JOIN Child AS c ON p.Id = c.ParentId");

我得到了parents的预期结果,列表中的三个项目具有正确的id,但没有正确的子节点。前两个是正确的,他们连接的孩子,"第一孩子"answers"第二孩子",但是第三个在数据库中没有孩子的父母得到一个孩子的默认实例。我的意思是,第三个父节点有一个count为1的子节点集合。该列表包含一个只有默认值的子列表。Id = 0, Name = NULL, ParentId = 0。这不是我想要的。我希望这个集合不包含任何儿童。我看到的替代方案是该集合为空或illist的一个实例,但不包含任何项。

我做错了什么,我该如何改正?

PetaPoco.默认情况下,获取多对一的关系扩展会给我不想要的子节点

应该有一个接受第二个lambda的重载。如果没有,那么你应该可以使用这个版本。https://github.com/schotime/NPoco/blob/dev2.0/src/NPoco/RelationExtensions.cs

您可能必须将IDatabase更改为Database,但它应该正常工作。

否则叫:

db.FetchOneToMany<Parent, Child>(p => p.Id, c => c.Id, "your sql here");

第二个lambda是子表的主键。