在LINQ

时间:2017-11-09 19:54:35

标签: c# sql entity-framework linq code-first

首先在C#代码中使用许多具有零关系的子类型表!

 public class MemberContractRelation
{
    [Key]
    public long Id { get; set; }
    public long ContractId { get; set; }
    public long MemberId { get; set; }
    public long ListPrice { get; set; }
    public decimal TaxCountryToPay { get; set; }
    public decimal TaxProvinceToPay { get; set; }
    public long InsuredCode { get; set; }

}


 public class FamilyMemberContractSubtype : MemberContractRelation
{
    public long CalculatedCheckupPrice { get; set; }

}

我希望通过以下代码获取具有子类型相关记录(如左连接)的父表(MemberContractRelation)列表:

 var familyMemberContractSubtype = _rep.FamilyMemberContractSubtype.Where(a => a.Id == ContractId).Select(x => new
          FamilyMemberInformationsBag
        {
            BirthDate = x.Member.BirthDate,
            FirstName = x.Member.FirstName,
            LastName = x.Member.LastName,
            NationalID = x.Member.NationalCode,
            PhoneNumber = x.Member.IranPhoneNumber,
            Price = x.ListPrice,
            ChekUpPrice = x.CalculatedCheckupPrice,
            TotalPrice = x.ListPrice + x.CalculatedCheckupPrice + x.TaxProvinceToPay + x.TaxCountryToPay,
            TaxProvinceToPay = x.TaxProvinceToPay,
            TaxCountryToPay = x.TaxCountryToPay

        }).ToList();

但它只返回具有子类型的记录,并且不会返回MemberContractRelation中的其他记录! 我想得到一个带有子类型的MemberContractRelation列表,如果它没有记录在子类型中,则在子类型中返回属性的Null值!

请记住,除了上述解决方案之外,我无法为我的项目使用任何其他解决方案!

1 个答案:

答案 0 :(得分:1)

假设这是使用EF TPT继承策略(看起来如此),首先应该从父(基)表开始查询:

// instead of _rep.FamilyMemberContractSubtype
// assuming _rep is DbContext
_rep.Set<MemberContractRelation>()

然后使用operator as(important:not cast!)来访问子类型成员,将非可空类型提升为可空。在您的样本中:

ChekUpPrice = (long?)(x as FamilyMemberContractSubtype).CalculatedCheckupPrice

TotalPrice = x.ListPrice + x.TaxProvinceToPay + x.TaxCountryToPay +
    ((long?)(x as FamilyMemberContractSubtype).CalculatedCheckupPrice ?? 0)