【问题标题】:LINQ with EF Core returning duplicated results带有 EF Core 的 LINQ 返回重复的结果
【发布时间】:2021-09-03 09:39:37
【问题描述】:

我正在使用带有 LINQ 的 Entity Framework Core 来执行一些连接,但它没有按预期发生,如果选择两个对象,它会返回重复,如果我只选择一个人,则电话列表为空。我有我的对象:

public class Person{
        private string _Name;
        private string _CompanyTradeName;

        [Key, Column("pID")]
        public uint PersonID { get; set; }

        [Column("pUUID")]
        public Guid PersonUUID { get; set; }

        [Column("pType")]
        public string Type { get; set; }

        [Column("pCrptName")]
        public string Name { 
            get { return Encryption.DecryptString(_Name); } 
            set { _Name = value; } 
        }

        [Column("pCrptCompanyTradeName")]
        public string CompanyTradeName { 
            get { return (_CompanyTradeName != null) ? Encryption.DecryptString(_CompanyTradeName) : null; }
            set { _CompanyTradeName = value; } 
        }

        [Column("pProfilePicture")]
        public string ProfilePicture { get; set; }

        [Column("pStatus")]
        public bool Status { get; set; }

        public virtual ICollection<PersonAddress> PersonAddresses { get; set; }

        public virtual ICollection<PersonDoc> PersonDocs { get; set; }

        public virtual ICollection<PersonPhone> PersonPhones { get; set; }
}

我的 PersonPhone 类:

    public class PersonPhone {
        private string _PhoneNumber;

        [Key, Column("ppID")]
        public uint PersonPhoneID { get; set; }

        [Column("ppUUID")]
        public Guid PersonPhoneUUID { get; set; }

        [Column("pID")]
        public uint PersonID { get; set; }

        public PhoneType PhoneTypes { get; set; }

        [Column("ptID")]
        public uint PhoneTypeID { get; set; }

        [Column("ppCrptPhoneNumber")]
        public string PhoneNumber { get { return Encryption.DecryptString(_PhoneNumber); } set { _PhoneNumber = value; } }
    }

我正在尝试返回 PersonPhone 与 Person 的连接,但它返回 null:

var query = from p in _context.Person
            join pp in _context.PersonPhone on p.PersonID equals pp.PersonID
            select p;

            return Ok(await query.FirstOrDefaultAsync());

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 我可能会离开这里,但p 不应该是PersonPhones 中唯一的电话集合...有点像join pp in p.PersonPhones on p.PersonID equals pp.PersonID。我只是不清楚你是想要电话还是那个人。
  • 请您也展示一下您的 PersonPhone 课程吗?
  • @Serge 我已经编辑了帖子。

标签: c# linq .net-core entity-framework-core linq-to-entities


【解决方案1】:

你可以试试

var personId=...
var person= await  _context.Person
             .Where(p=>p.PersonID=personId
             .Include(p=> p.PersonPhones)
             .FirstOrDefaultAsync());
return Ok(person);

或者如果你只想要手机

var personId=...
var phones = await  _context.PersonPhones
             .Where(p=>p.PersonID=personId
             .Include(p=> p.Person)
             .ToListAsync());
return Ok(phones);

但在这种情况下,您将不得不修复类

public class PersonPhone {
        private string _PhoneNumber;

        [Key, Column("ppID")]
        public uint PersonPhoneID { get; set; }


        [Column("ppUUID")]
        public Guid PersonPhoneUUID { get; set; }

        [Column("pID")]
        public uint PersonID { get; set; }

        public virtual Person Person {get; set;}

     .....
    }

【讨论】:

  • 但我试图将个人电话包含在与 Person 相同的对象中,以检索所有信息。在这种情况下,它不是 ICollection?
  • @JoãoPedro 现在一个人可以有多个一号。所以一个人可以拥有一组 PersonPhones
  • 有什么方法可以使用 LINQ 代替 .Include() EF Core 函数?只是为了好奇。
  • 是的,您可以按照您的方式进行操作,但是如果您有 2 部手机,您将有 2 条记录。所以你必须分组来避免它,代码会复杂得多。
猜你喜欢
  • 2017-01-18
  • 2017-12-29
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
相关资源
最近更新 更多