Petapoco relationextensions fetchmanytoone默认情况下会给我不想要的孩子

时间:2012-12-28 18:44:08

标签: c# petapoco npoco

我有两个表,例如:

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和relationextensions之类的时候(其中db是Petapocos数据库对象的实例):

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

我得到父母的预期结果,我的列表中的三个项目具有正确的ID但没有正确的孩子。前两个对于他们的连接孩子是正确的,“第一个孩子”和“第二个孩子”但是在数据库中没有孩子的第三个父母得到孩子的默认实例。我的意思是第三个父级有一个计数为1的子集合。该列表包含一个只有默认值的子节点。 Id = 0,Name = NULL,ParentId = 0.这不是我想要的。我希望那个系列不包含任何儿童。我看到的替代方案是集合为null或IList的实例但没有项目。

我做错了什么,我怎么能纠正它?

1 个答案:

答案 0 :(得分:2)

应该有一个需要第二个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是子表的主键。