嵌套类:在父类中调用子类属性[重复]

问题描述 投票:0回答:2

我有一个 Rigmodel 类,在 RigModel 类中我有 RigDetails 类作为属性。我在 RigModel 的构造函数中初始化 RigDetails,如下所示。

public class RigModel  
{
    public RigModel()
    {
        Rig = new Rigdetails();
    }
    public Rigdetails Rig { get; set; }
}

public class Rigdetails
{
    public string Id { get; set; }
    public string Title { get; set; }
    public bool Enabled { get; set; }
}

我还有另一个类 JobModel。

public class JobModel
{
    public string Id { get; set; }
    public string Job_code { get; set; }
    public string Product_line { get; set; }
    public string Geomarket { get; set; }
    public string Roc { get; set; }
    public string Network { get; set; }
    public string Rig { get; set; }
    public string Simple_help { get; set; }
    public string Created { get; set; }
    public string Modified { get; set; }
    public string Modified_by { get; set; }
}

我有两个单独的列表工作模型和装备模型与上述两个类。现在将两个列表属性绑定到新模型(JobRigBsonModel)中。使用下面的查询。

var result = jobModels.Join(rigModels, j => j.Rig, r => **r.Rig.Id**, (j, r) =>
    new RigJobBsonModel
    {
        Id = j.Id,
        Job_code = j.Job_code,
        Product_line = j.Product_line,
        Geomarket = j.Geomarket,
        Roc = j.Roc,
        Network = j.Network,
        Simple_help = j.Simple_help,
        Created = j.Created,
        Modified = j.Modified,
        Modified_by = j.Modified_by,
        Rigs = new Rig { Title = r.Rig.Title, Enabled = r.Rig.Enabled }
    });

在上面的查询中出现粗体错误“对象引用未设置到对象的实例”。我怎样才能得到加入班级的结果? 下面是被调用的整个函数。

private static List<RigJobBsonModel> updateJobWithRigDetails(
    List<JobModel> jobModels, List<RigModel> rigModels)
{
    try
    {
        var result = jobModels.Join(rigModels, j => j.Rig, r => r.Rig.Id, (j, r) =>
            new RigJobBsonModel
            {
                Id = j.Id,
                Job_code = j.Job_code,
                Product_line = j.Product_line,
                Geomarket = j.Geomarket,
                Roc = j.Roc,
                Network = j.Network,
                Simple_help = j.Simple_help,
                Created = j.Created,
                Modified = j.Modified,
                Modified_by = j.Modified_by,
                Rigs = new Rig { Title = r.Rig.Title, Enabled = r.Rig.Enabled }
            });
        return result.ToList();
    }
    catch (System.Exception ex)
    {
        throw ex;
    }
}

下面是现有的模型,我在使用上面的 linq 查询进行查询时绑定它。

public class RigJobBsonModel
    {
        public string Id { get; set; }
        [BsonElement]
        public string Job_code { get; set; }
        [BsonElement]
        public string Product_line { get; set; }
        [BsonElement]
        public string Geomarket { get; set; }
        [BsonElement]
        public string Roc { get; set; }
        [BsonElement]
        public string Network { get; set; }
        [BsonElement]
        public string Simple_help { get; set; }
        [BsonElement]
        public string Created { get; set; }
        [BsonElement]
        public string Modified { get; set; }
        [BsonElement]
        public string Modified_by { get; set; }
#nullable enable
        [BsonElement]
        public RigDetails? Rigs { get; set; }
    }
c# linq oop
2个回答
-1
投票

不要设置为可为空。 - 如果没有找到 - 对象将为空, 你加入的方式 - 就像内部加入 这是示例(请告诉我它是否解决了您的问题)

void Main()
{
    var jobModels = new List<JobModel>() { new JobModel() {
    Id = "1",
    Rig = "1",
    Job_code = "000", Network = "www", Product_line = "sale", Created = DateTime.Now.ToString()
    },
    new JobModel() {
    Id = "2",
    Rig = "3",
    Job_code = "000", Network = "www", Product_line = "sale", Created = DateTime.Now.ToString()
    }};
    var rigModels = new List<RigModel>() { new RigModel() { Rig = new Rigdetails() {
    Id = "1" ,Title="rig1", Enabled= true
    } }};
    
    var result = jobModels.Join(rigModels, j => j.Rig, r => r.Rig.Id, (j, r) =>
                                               new RigJobBsonModel
                                               {
                                                   Id = j.Id,
                                                   Job_code = j.Job_code,
                                                   Product_line = j.Product_line,
                                                   Geomarket = j.Geomarket,
                                                   Roc = j.Roc,
                                                   Network = j.Network,
                                                   Simple_help = j.Simple_help,
                                                   Created = j.Created,
                                                   Modified = j.Modified,
                                                   Modified_by = j.Modified_by,
                                                   Rigs = new Rigdetails { Title = r.Rig.Title, Enabled = r.Rig.Enabled, Id = r.Rig.Id }
                                               });
                                               
result.Dump();                                             
}

public class RigJobBsonModel
{
    public string Id { get; set; }
    public string Job_code { get; set; }
    public string Product_line { get; set; }
    public string Geomarket { get; set; }
    public string Roc { get; set; }
    public string Network { get; set; }
    public string Simple_help { get; set; }
    public string Created { get; set; }
    public string Modified { get; set; }
    public string Modified_by { get; set; }
    public Rigdetails Rigs { get; set; }
}
public class JobModel
{
    public string Id { get; set; }
    public string Job_code { get; set; }
    public string Product_line { get; set; }
    public string Geomarket { get; set; }
    public string Roc { get; set; }
    public string Network { get; set; }
    public string Rig { get; set; }
    public string Simple_help { get; set; }
    public string Created { get; set; }
    public string Modified { get; set; }
    public string Modified_by { get; set; }
}

public class RigModel
{
    public RigModel()
    {
        Rig = new Rigdetails();
    }
    public Rigdetails Rig { get; set; }

}


public class Rigdetails
{
    public string Id { get; set; }
    public string Title { get; set; }
    public bool Enabled { get; set; }
}


只有 1 个匹配结果(示例中的 Rig 3 不存在,因此不会链接)

enter image description here

如果您需要显示其他 RigJobBsonModel,则需要不同的技术来连接表。


-1
投票

另一种方法(基于之前的评论)

var lst = new List<RigJobBsonModel>();
    jobModels.ForEach(fe =>
    {
        var rj = new RigJobBsonModel()
        {
            Id = fe.Id,
            Job_code = fe.Job_code,
            Product_line = fe.Product_line,
            Geomarket = fe.Geomarket,
            Roc = fe.Roc,
            Network = fe.Network,
            Simple_help = fe.Simple_help,
            Created = fe.Created,
            Modified = fe.Modified,
            Modified_by = fe.Modified_by,
            Rigs = rigModels.Where(rm => rm.Rig.Id == fe.Rig).FirstOrDefault()?.Rig
        };
        lst.Add(rj);
    });
    lst.Dump();     

会回报你

enter image description here

请注意:

.FirstOrDefault()?.Rig
© www.soinside.com 2019 - 2024. All rights reserved.