Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果子项为空,请选择多个丢失的父项_C#_Linq - Fatal编程技术网

C# 如果子项为空,请选择多个丢失的父项

C# 如果子项为空,请选择多个丢失的父项,c#,linq,C#,Linq,使用selectmany展平列表,当子对象为空时,如何获取父对象 我需要显示列表: “付款人:付款人A,状态:活动” “付款人:付款人A,状态:顶部” “付款人:付款人A,状态:快速” 付款人:付款人B,状态:“--” //父类 公共类付款人 { 公共字符串名称{get;set;} 公共列表状态{get;set;} } //儿童班 公共阶级地位 { 公共字符串名称{get;set;} } 静态void Main(参数字符串[]args) { //让我们构建一些示例数据 列表付款人=新列表() {

使用selectmany展平列表,当子对象为空时,如何获取父对象

我需要显示列表:

“付款人:付款人A,状态:活动”
“付款人:付款人A,状态:顶部”
“付款人:付款人A,状态:快速”
付款人:付款人B,状态:“--”

//父类
公共类付款人
{
公共字符串名称{get;set;}
公共列表状态{get;set;}
}
//儿童班
公共阶级地位
{
公共字符串名称{get;set;}
}
静态void Main(参数字符串[]args)
{
//让我们构建一些示例数据
列表付款人=新列表()
{
新付款人()
{
Name=“付款人A”,
状态=新列表()
{
新状态(){Name=“Active”},
新状态(){Name=“Top”},
新状态(){Name=“Fast”}
}
},
新付款人()
{
Name=“付款人B”,
状态=新列表()
{
//付款人B没有身份
}
}
};
var payerStatuses=payers.SelectMany
(
payer=>payer.Status,//选择子项
(付款人,stat)=>新建{Name=payer.Name,Status=stat.Name}//告诉Linq从父(付款人)和子(Status)获取什么
);
//让我们看看我们得到了什么
foreach(payerStatus中的var payerStatus)
{
WriteLine(“付款人:{0},状态:{1}”,payerStatus.Name,payerStatus.Status);
}
//结果:
//付款人:付款人A,状态:活动
//付款人:付款人A,状态:顶部
//付款人:付款人A,状态:Fast
//但我也需要付款人B!
}

我在猜你想做什么。你想有一个付款人状态对象。你想看到付款人B的三个对象而不是a的,对吗

您不应混合使用linq样式。下面是一些如何使用SelectMany的示例:

// Parent class
public class Payer
{
    public string Name { get; set; }
    public List<Status> Status { get; set; }
}

// Child class
public class Status
{
    public string Name { get; set; }
}

static void Main(params string[] args)
{
    // Lets build some example-data
    List<Payer> payers = new List<Payer>()
    {
        new Payer()
        {
            Name = "Payer A",
            Status = new List<Status>()
            {
                new Status() { Name = "Active" },
                new Status() { Name = "Top" },
                new Status() { Name = "Fast" }
            }
        },
        new Payer()
        {
            Name = "Payer B",
            Status = new List<Status>()
            {
                // Payer B got no Status
            }
        }
    };

    var payerStatuses = payers.SelectMany
    (
        payer => payer.Status.DefaultIfEmpty(), // Select the Children. If no status, we want an empty list
        (payer, stat) => new { Name = payer.Name, Status = stat == null ? null : stat.Name } // Tell Linq what to take from parent (payer) and what to take from child (status). check if status is not null, because we receive an empty status-list for payers without status
    );

    // let's see what we got
    foreach (var payerStatus in payerStatuses)
    {
        Console.WriteLine("Payer: {0}, Status: {1}", payerStatus.Name, payerStatus.Status);
    }
    // Expected:
    // "Payer: Payer A, Status: Active"
    // "Payer: Payer A, Status: Top"
    // "Payer: Payer A, Status: Fast"
    // "Payer: Payer B, Status: "
}
//父类
公共类付款人
{
公共字符串名称{get;set;}
公共列表状态{get;set;}
}
//儿童班
公共阶级地位
{
公共字符串名称{get;set;}
}
静态void Main(参数字符串[]args)
{
//让我们构建一些示例数据
列表付款人=新列表()
{
新付款人()
{
Name=“付款人A”,
状态=新列表()
{
新状态(){Name=“Active”},
新状态(){Name=“Top”},
新状态(){Name=“Fast”}
}
},
新付款人()
{
Name=“付款人B”,
状态=新列表()
{
//付款人B没有身份
}
}
};
var payerStatuses=payers.SelectMany
(
payer=>payer.Status.DefaultIfEmpty(),//选择子项。如果没有状态,我们需要一个空列表
(付款人,stat)=>new{Name=payer.Name,Status=stat==null?null:stat.Name}//告诉Linq从父代(付款人)获取什么,从子代(状态)获取什么。检查状态是否不为null,因为我们收到的付款人状态列表为空,没有状态
);
//让我们看看我们得到了什么
foreach(payerStatus中的var payerStatus)
{
WriteLine(“付款人:{0},状态:{1}”,payerStatus.Name,payerStatus.Status);
}
//预期:
//付款人:付款人A,状态:活动
//付款人:付款人A,状态:顶部
//付款人:付款人A,状态:Fast
//付款人:付款人B,状态:
}

所以你有付款人,每个付款人都有零个或多个付款人状态

我需要使用selectmany,以便根据状态获取行

不知道这意味着什么。你开始提到解决方案,然后你开始说你想要的,但解决方案不起作用?也许下次先指定你想要的,然后是你尝试的,然后告诉我们为什么不起作用

除了你没有告诉我们你想要什么,你还忘了写你的Payer和PayerStatus类

您是否有一个类“具有此状态的付款人”,就像您使用实体框架时一样?还是只有两个单独的表

如果您只有两个单独的表,那么如何指示付款人状态属于哪个付款人?每个付款人状态是否属于一个付款人(一对多关系),或者是否存在可能属于多个付款人(多对多)的付款人状态,或者是否存在根本不属于付款人的付款人状态

让我们假设您的关系是最常见的:付款人和付款人状态之间存在一对多关系。:每个付款人都有零个或多个付款人状态;每个付款人状态只属于一个付款人

在表中,通常使用主键和外键解决此问题:

class Payer
{
    public int Id {get; set;}  // primary key

    ... // other Payer properties
}

class PayerStatus
{
    public int Id {get; set;}  // primary key

    // every PayerStatus belongs to exactly one Payer using foreign key:
    public int PayerId {get; set;}

    ... // other properties
}
如果你有这样的表格,那么要得到“每个付款人和他的付款人状态”,你需要做一个

上面的linq声明将为您提供

Payer 10, name A with Status list containing data from statuses 21 and 23
Payer 11. name B with Status list with one element containing data from status 22
Payer 12, name C with empty status list
很多时候,人们不希望付款人有他的状态,而是希望每个付款人有一行和一个状态

10 - A - status 21
10 - A - status 23
11 - B - status 22
12 - C - (null)
我从来没有找到一个合适的用例,您更喜欢这个,而不是GroupJoin。我认为这仍然是一个需求,因为人们认为SQL语句的局限性是没有一个join来获取“付款人及其状态”,因此他们选择了下一个最好的方法,a:

在GroupJoin之后继续:

.SelectMany(payer => payer.Statusses.DefaultIfEmpty(),
    (payer, status) => new
    {
        // payer properties:
        PayerId = payer.PayerId,
        PayerName = payer.Name,
        Reputation = payer.Reputation,

        // status properties:
        StatusDescription = status.Description,
        StatusValue = status.Value,
    });

如果你想改进你的问题,你可以自由地从我的答案中提取示例代码(如果我正确理解了你的问题)。您的问题不清楚。请更新它。完全正确!但我希望Payer B修改示例。您应该修改您的问题。很难读懂您想要的内容。将示例类和您想要的输出添加到您的问题中。@kara上面的回答对一个有一个孩子的家长来说很有用,但是如果类为Stat,您将如何修改代码美国有一个孩子(也可以是空的)?类似:)发布一个问题。编辑此问题将使其成为空的
Payer 10, name A with Status list containing data from statuses 21 and 23
Payer 11. name B with Status list with one element containing data from status 22
Payer 12, name C with empty status list
10 - A - status 21
10 - A - status 23
11 - B - status 22
12 - C - (null)
.SelectMany(payer => payer.Statusses.DefaultIfEmpty(),
    (payer, status) => new
    {
        // payer properties:
        PayerId = payer.PayerId,
        PayerName = payer.Name,
        Reputation = payer.Reputation,

        // status properties:
        StatusDescription = status.Description,
        StatusValue = status.Value,
    });