使用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; }
}

使用Linq从链接表中获取用户名

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)