0

例如,我有两个表,例如:

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 是 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. 这不是我想要的。我希望该集合不包含任何孩子。我看到的替代方法是集合为空或 IList 的实例但没有项目。

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

4

1 回答 1

2

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

您可能必须将其更改为IDatabaseDatabase但它应该可以正常工作。

否则调用:

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

第二个 lambda 是子表的主键。

于 2013-01-01T05:05:09.623 回答