从DB.Entity

时间:2019-07-08 21:15:32

标签: c# entity-framework linq

我有一个POCO类,其中有一个未映射到数据库的特定属性(称为:is_confirmed)。相反,我希望此属性在另一个表中检查特定用户的is_confirmed值是否为true。 我尝试使用下面的代码,但出现错误:is_confirmed = The function evaluation requires all threads to run.

我的问题分为两部分:

  1. 我如何传递当前用户别名

  2. 我如何使它工作,因为现在它不是在产生值而是错误

到目前为止,这是我的代码。

   [Table("participants")]
    public class participant
    {
        public int ID { get; set; }
        public string firstname { get; set; }
        public string lastname { get; set; }
        public string alias { get; set; }

        [NotMapped]
        public Boolean is_confirmed
        {
            get
            {
                dbContext DB;
                DB = new dbContext();
                return DB.confirmedParticipants.Where(x => x.is_confirmed == true && x.participantAlias == "aliashere").ToList().Count > 0;
            }
            set {  }
        } 

    }

1 个答案:

答案 0 :(得分:0)

通常,这样的事情不是实体关心的问题,而是实体消费者的关心的问题,例如ViewModel。参与者实体将具有可用的详细信息或关系来评估其是否得到确认。确认将别名链接到参与者而不是参与者ID似乎很不寻常。

仅给出您已公开的详细信息,而无需进一步了解表结构:

[Table("participants")]
public class participant
{
    [Key]
    public int ID { get; set; }
    public string firstname { get; set; }
    public string lastname { get; set; }
    [ForeignKey("Confirmations")]
    public string alias { get; set; }

    public virtual ICollection<ParticipantConfirmations> Confirmations { get; set; } = new List<ParticipantConfirmation>();
}
[Table("confirmedParticipants")]
public class ParticipantConfirmation
{
    [Key]
    public string alias { get; set; }
    public bool is_confirmed { get; set; }
    // etc.
}

然后,在读取参与者的视图模型时:

[Serializable]
public class ParticipantViewModel
{
    public int ID { get; set; }
    public string FullName { get; set; }
    public string Alias { get; set; }
    public bool IsConfirmed { get; set; }
}

典型选择:

var participantVMs = db.Participants.Where(x => /* some condition */)
    .Select(x => new ParticipantViewModel
    {
        ID = x.ID,
        FullName = x.firstname + " " + x.lastname,
        Alias = x.alias,
        IsConfirmed = x.Confirmations.Any(c => c.is_confirmed)
     }).ToList();

关于EF ...的关键点

避免这样的事情:

.Where(x => x.is_confirmed == true && x.participantAlias == "aliashere").ToList().Count > 0;

相反,使用:

.Any(x => x.is_confirmed && x.participantAlias == "aliashere");

第一个语句将有效地执行SELECT * FROM [Participant_Confirmed] WHERE is_confirmed = true AND participant_alias = 'aliashere',该操作将简单地返回所有匹配行的所有字段,以便您检查是否存在行。

第二条语句将有效地执行SELECT EXISTS ...,该结果将返回True或False结果,这是使用更少的内存并通过网络发送的数据少得多的更快的查询。

从命名和字段的预感来看,似乎已确认的参与者将是参与者平视参与者是否被确认的观点。如果是这种情况,那么我将仅利用绑定到该视图的实体进行读取操作,如果/当我想更新有关参与者的数据时,则加载参与者。没有看到整个画面很难确定,但是我怀疑您可以利用一些可观的优化来避免过于频繁地访问数据库。