如何合并两个不同对象的列表?

时间:2019-01-22 18:23:53

标签: c# asp.net-mvc list linq

我有两个不同对象的数据实体类,例如-

class UserDetails
{
   int Id,
   DateTime DoB,
   string Name,
   .....
   .....
   .....
}

class Documents 
{
   int Id,
   int UserIdFK,
   string ImagePath,
   .....
   .....
}

我正在从下面的LINQ查询中获取数据-

var UserInfo = (from UserDetail in _userDBContext.UserDetails
                                             join doc in _userDBContext.Documents on UserDetail.Id equals doc.UserIdFK
                                             select new { UserDetail, doc }).ToList();

现在我在UserInfo列表中获取数据,但数据位于2行中,UserDetails位于第一行,Documents位于第二行,如何将它们(userInfo和Document数据)合并到一个只有一个行的列表中。这样我就可以在Razor Pages(前端)中使用该列表。

我什至创建了另一个对象,然后尝试将UserInfo List项目转换为新列表,但无法这样做,将两个表的选定对象合并为一个列表的方法是什么。请帮我找到一个优雅的解决方案。

    public class UserKycCompositeModel
    {
       int Id,
       DateTime DoB,
       string Name,
       .......
       .......
       .......
       int Id,
       int UserIdFK,
       string ImagePath,
       .........
       .........
       .........
  }

4 个答案:

答案 0 :(得分:0)

如果Documents类和UserDetails类之间存在多对一的关系(这意味着UserDetails类可以具有多个Documents),则最好给UserDetails类一个Documents

的列表

List<Documents>添加到UserDetails类:

public class UserDetails
{
    public List<Documents> Documents { get; set; }
}

首先选择唯一的UserDetails

var userDetails = from ud in _userDBCOntext.UserDetails
                  select ud;

这将导致IEnumerable<UserDetails>。遍历该IEnumerable并获取每个Documents实例的所有UserDetails

foreach (var userDetail in userDetails)
{
    userDetail.Documets = from doc in _userDBContext.Documents
                          where userDetail.Id equals doc.UserIdFK
                          select doc;
}

现在您有一个IEnumerable<UserDetails>(名为userDetails),它具有与之对应的所有Documents

答案 1 :(得分:0)

总是最好创建一个特定的ViewModel将其绑定到View。 Window的回答应该对您有用。如果您仍然希望拥有通用列表,则对该查询稍作调整应该可以为您提供帮助。

    var UserInfo = (from UserDetail in _userDBContext.UserDetails
                    join doc in _userDBContext.Documents 
                    on UserDetail.Id equals doc.UserIdFK
                    select new
                    {
                        UserId = UserDetail.Id,
                        DoB = UserDetail.DoB,
                        Name = UserDetail.Name,
                        DocId = doc.Id,
                        doc.UserIdFK,
                        doc.ImagePath
                    }).ToList();

答案 2 :(得分:0)

选择特定的对象属性到您的复合对象中

List<UserKycCompositeModel> userKycCompositeModels = (from UserDetail in _userDBContext.UserDetails
    join doc in _userDBContext.Documents on UserDetail.Id equals doc.UserIdFK
    select new UserKycCompositeModel { UserDetail.Id, UserDetail.Dob, **...etc.** }).ToList();

答案 3 :(得分:0)

因为var UserInfo是一个列表。您不能/应该使用未定义的属性创建对象。

如果坚持使用这种方法,则可以使用arun Mohan所说的方式来创建匿名对象。

new {
   UserId = UserDetail.Id,
   DoB = UserDetail.DoB,
   Name = UserDetail.Name,
   DocId = doc.Id,
   doc.UserIdFK,
   doc.ImagePath
}

我不建议那样使用新的类UserKycCompositeModel,但是(在性能和控制方面)比具有动态对象更好。

如果要避免调用每个属性(例如UserID = UserDetail.ID),另一件事是使用反射,如下所示:

UserKycCompositeModel newObj = new UserKycCompositeModel();

foreach (var item in yourObject.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly))
{
    propertyValue = item.GetValue(yourObject, null);
    Type myType = typeof(newObj);                   
    PropertyInfo myPropInfo = myType.GetProperty(item.Name);
    myPropInfo.SetValue(this, value, null);
}

我相信,有很多方法不能完全按照自己的意愿去做,但是根据您在逻辑业务中的使用方式,您可以用其他方法来做。

我喜欢这样做:

public class UserKycCompositeModel
{
    public UserKycCompositeModel(UserDetails ud,Documents  doc)
    {
        this.UserDetails = ud;
        this.Document = doc;
    }
    public UserDetails UserDetails {get; private set;}
    public Documents Document {get; private set;}

}

然后以这种方式进行呼叫:

var UserInfo = (from UserDetail in _userDBContext.UserDetails
                     join doc in _userDBContext.Documents on UserDetail.Id equals doc.UserIdFK
                     select new UserKycCompositeModel(UserDetail, doc)).ToList();

并使用用户信息,例如UserInfo.UserDetails或UserInfo.Documents。

还有更多的方法,但是也许您必须解释为什么要它摇摆,或者看看您是否要遵循使用实体的常规方法。