Как объединить два списка разных объектов? - PullRequest
0 голосов
/ 22 января 2019

У меня есть два класса объектов данных различных объектов, таких как -

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 строках, 1-й строке для UserDetails и 2-й строке для документов, как их объединить (данные userInfo и Document) в один список, содержащий только одну строку. Чтобы я мог использовать этот список в Razor Pages (Front end).

Я даже создал другой объект, а затем попытался преобразовать элементы списка UserInfo в новый список, но не смог этого сделать. Каковы способы получения выбранных объектов обеих таблиц в один список? Пожалуйста, помогите мне найти элегантное решение.

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

Ответы [ 4 ]

0 голосов
/ 22 января 2019

Потому что var UserInfo - это список.Вы не можете / должны создать объект со свойствами, которые не определены.

Если вы продолжите использовать этот подход, вы можете создать объект anonymus так, как говорит Арун Мохан.

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);
}

Есть много способов, я полагаю, не делать именно то, что вы хотите, но в зависимости от того, как вы будете использовать это в своем логическом бизнесе, вы можете сделать это по-другому.

Iпредпочитаю делать:

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.

ТамЕсть и другие способы, но, возможно, вам придется объяснить, почему вы хотите, чтобы это произошло, или посмотреть, хотите ли вы следовать обычному способу использования сущностей.

0 голосов
/ 22 января 2019

Всегда лучше создать конкретную модель представления, чтобы связать ее с представлением. Ответ окна сверху должен работать для вас. Если вы все еще хотите иметь общий список, вам может помочь небольшая настройка запроса.

    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();
0 голосов
/ 22 января 2019

Выберите свойства конкретного объекта в составном объекте:

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();
0 голосов
/ 22 января 2019

Если существует отношение многие-к-одному между классом 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что соответствует ему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...