我有两个不同对象的数据实体类,例如-
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,
.........
.........
.........
}
答案 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。
还有更多的方法,但是也许您必须解释为什么要它摇摆,或者看看您是否要遵循使用实体的常规方法。