遍历列表时获取空值

时间:2019-09-20 13:28:05

标签: c# entity-framework

EntityMapper<Datahub.Test_Consumer, Models.ConsumerBio> entObject = new EntityMapper<Datahub.Test_Consumer, Models.ConsumerBio>();
EntityMapper<Datahub.Test_Address, Models.ConsumerAddress> entObjectAdd = new EntityMapper<Datahub.Test_Address, Models.ConsumerAddress>();
EntityMapper<Datahub.Test_CardDetails, Models.ConsumerCardDetails> entObjectcard = new EntityMapper<Datahub.Test_CardDetails, Models.ConsumerCardDetails>();

List<Models.ConsumerBio> lstModConsumer = new List<Models.ConsumerBio>();           
List<Models.ConsumerAddress> lstobjConAdd = new List<Models.ConsumerAddress>();
List<Models.ConsumerCardDetails> lstobjConcard = new List<Models.ConsumerCardDetails>();

List<Datahub.Test_Consumer> lstDBConsumer = Datahub.DataLayer.GetAllConsumerList();
//  Models.ConsumerFamilyMember objConFMembers = new Models.ConsumerFamilyMember();           

foreach (var item in lstDBConsumer)
{
    foreach (var itemadd in item.Test_Address)
    {
        lstobjConAdd.Add(entObjectAdd.translate(itemadd));
    }

    foreach (var itemcard in item.Test_CardDetails)
    {
        lstobjConcard.Add(entObjectcard.translate(itemcard));                   
    }                

    lstModConsumer.Add(entObject.translate(item));
}

因此,在上面的lstDBConsumer对象中,我获取了所有的db值,但是在对lstModConsumer进行迭代和分配值时,我获取了除DOB字段以外的所有空值。请告诉我解决方案吗?

1 个答案:

答案 0 :(得分:0)

如果要访问数据库上下文之外的子属性(看起来确实如此),则在从数据库中选择时需要显式包括它们。

使用MS中的一个简单示例显示包含项:

var blogs = new List<Blogs>();
var posts = new List<Posts>();
using (var context = new BloggingContext())
{
    blogs = context.Blogs.Include(blog => blog.Posts).ToList();
}
foreach(var p in blogs.Posts)
{
  posts.add(p);
}

但是,如果您仍在数据库连接的上下文中进行分配,则只需调用该属性即可。在这种情况下,枚举会自动进行,因为它仍然具有数据库的上下文来检索属性。

var posts = new List<Posts>();
using (var context = new BloggingContext())
{
    var blogs = context.Blogs.Include(blog => blog.Posts).ToList();
    foreach(var p in blogs.Posts)
    {
       posts.add(p);
    }
}

由于默认启用的“延迟加载”概念,Entity Framework不会自动加载导航属性(即您不会自动获取对象的子对象)。

想象您有一个庞大的关系数据库,当您执行简单查询时,它会自动提取所有相关对象。如果自动加载所有关系,那么非常简单的查询可能会产生巨大的影响。可能是一场潜在的噩梦。现在,有一种方法可以关闭延迟加载,这不在此问题的上下文范围内。请参考以下链接,以获取更多的简要阅读和更详细的解释:https://docs.microsoft.com/en-us/ef/core/querying/related-data

在一个真实的建模示例中,假设您与两个朋友John和Jane进行了互动。

您和约翰通电话,问他早上的计划是什么。他正在9:30参加会议。

然后您挂断电话,给Jane打电话,告诉她John当天的计划。您告诉Jane 9:30会议,然后她问“谁将参加会议?”

您没有任何线索,因为当您与约翰交谈时您没有问约翰。您知道会议有与会者,但您不知道他们是谁,因为当您与John交谈时您没有问他。您还知道会议有议程,地点,电话号码等。如果您不关心所有细节,那么获取会议的所有明确细节将是非常低效的。如果您每次与他互动时,John都这样操作,John可能会停止接听电话。

但是在另一种情况下,您问约翰会去哪儿(也包括属性,然后您将得到答案),因为您知道当珍妮当天晚些时候与她交谈时会想知道。

OR

如果您正在与John和Jane进行电话会议,并且提出了问题(当我们想查找其他信息时仍在数据库上下文中),则该信息将随时可用,因为John正在通话。

希望这很有道理。