使用Linq从链接表中获取用户名
本文关键字:获取 用户 链接表 Linq 使用 | 更新日期: 2023-09-27 18:26:30
我有一个名为tblAuditRecord的表,其中一个字段记录了作为审计员的登录用户ID。现在,当检索要查看的记录时,我想检索完成审计的实际用户名,而不是用户ID。我在查看单个审计记录时成功地做到了这一点,但我很难让它检索审计列表。
var tblauditrecord = db.tblAuditRecords.OrderByDescending(e => e.dateOfAudit)
上面的代码行当前返回审核列表(tolist扩展方法添加在代码的返回视图行的点上。
有人能告诉我如何通过匹配AuditorID和UserId来获得UserProfile表以获得UserName吗。
我尝试使用.include作为下面的代码
var tblauditrecord = db.tblAuditRecords.Include(e => e.UserProfileGetUsername);
但是得到一个错误"mscorlib.dll中发生了类型为"System.Reflection.TargetInvocationException"的异常,但未在用户代码中处理",该错误从的这行代码指向InitializeSimplemembershipAttribute.cs文件
LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
如果有人能提供一个解决方案,那就太好了(我打赌我会让它变得比需要的更复杂)
表模型代码添加到下面
[Table("tblAuditRecord")]
public class tblAuditRecord
{
[Key]
public int auditId { get; set; }
[Column(TypeName = "datetime2")]
public DateTime dateOfAudit { get; set; }
[StringLength(50)]
public string fleetNumber { get; set; }
[StringLength(50)]
public string nonFleetNumber { get; set; }
//public string auditType { get; set; } check about this one
[StringLength(200)]
public string bodyShopName { get; set; }
[StringLength(20)]
public string vehicleReg { get; set; }
[StringLength(30)]
public string vehicleMake { get; set; }
[StringLength(50)]
public string vehicleModel { get; set; }
[StringLength(150)]
public string vehicleAdditionalDetail { get; set; }
public int numberOfDoors { get; set; }
[StringLength(20)]
public string vehicleMileage { get; set; }
public int auditorID { get; set; }
[ForeignKey("UserId")]
public virtual UserProfile UserProfileGetUsername { get; set; }
public string auditorSignature { get; set; }
[Column(TypeName = "datetime2")]
public Nullable<DateTime> dateOfSignature { get; set; }
public bool machinePolished { get; set; }
public bool vehicleDriven { get; set; }
public string bodyShopContactName { get; set; }
public string bodyShopSignature { get; set; }
[Column(TypeName = "datetime2")]
public Nullable<DateTime> dateOfBodyShopSignature { get; set; }
public string additionalInformation { get; set; }
[Required]
[Display(Name = "Email Address")]
public string EmailAddress { get; set; }
public virtual ICollection<tblDamageLine> tblDamageLines { get; set; }
}
用户配置文件表
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
}
var query=来自用户配置文件中的u在u上的审核中加入a。UserID等于.auditorID选择u.UserName;
我不知道UserProfile的字段,所以如果您使用与tblAuditRecord中相同的命名方案,它们可能是.userID。用户配置文件也可以是tblUserProfile。
这段代码需要两个变量,一个是UserProfile类型(userprofiles),另一个是tblAuditRecord(audits),每个类都有完整的表。然后,根据匹配的id执行内部联接,并从结果表中检索所需的值(用户名)。
您没有太多选择,这取决于您对结果的期望:
var query = FROM
u IN userprofiles
JOIN
a in audits
ON
u.UserID EQUALS a.auditorID
SELECT
u.UserName,
a.dateOfAudit,
a.fleetNumber ,
a.nonFleetNumber ,
a.auditType,
a.bodyShopName,
...,
;
我已经通过在我的控制器类中使用.include找到了解决方案
var tblauditrecord = db.tblAuditRecords.Include(e => e.UserProfileGetUsername);
在我的审计表模型中,我添加了以下
public int auditorID { get; set; }
[ForeignKey("auditorID")]
public virtual UserProfile UserProfileGetUsername { get; set; }
在我的剃刀视图中,我这样调用用户名:
@Html.DisplayFor(modelItem => item.UserProfileGetUsername.UserName)