代码之家  ›  专栏  ›  技术社区  ›  Samuel

使用C#和导航属性查询实体框架

  •  1
  • Samuel  · 技术社区  · 6 年前

    首先,我对C#和EF都是新手。

    我已经在VS 2015 CE中和模型设计师创建了许多实体,并建立了关系。

    我想查询实体以返回特定合同的所有客户(例如,Contract\u ID=1),以及CustomerLocker和ContractCustomer实体的相关属性(如果存在CustomerLocker实体,则为CustomerLocker实体;如果不存在,则为null)。我还有来自合同实体的LockerNumber值(例如100)。

    如果有人能够帮助选择我需要的属性所需的LINQ查询,我将不胜感激。如果可能的话,我希望能够使用导航属性。

    到目前为止,我能够选择客户,但无法从CustomerLocker实体中选择属性。

        var myCustomers = (from cc in context.ContractCustomers
        where cc.Contract_ID.Equals(contractID)
        select new
        {
        Licencee = cc.IsLicencee,
        Added = cc.AddedDate,
        Firstname = cc.Customer.FirstName,
        Lastname =  cc.Customer.LastName,
        DOB = cc.Customer.DateOfBirth,
        Postcode = cc.Customer.PostCode,
        CustomerNumber = cc.CustomerNumber             
        }
        )
    

    entities shown in VS Model Designer

    2 回复  |  直到 6 年前
        1
  •  1
  •   Emre Kabaoglu    6 年前

    你可以得到 HasCard 从…起 CustomerLockers LockerNumber ;

    CustomerLockers = cc.Customer.CustomerLockers
    

    查询;

    var myCustomers = (from cc in context.ContractCustomers
        where cc.Contract_ID.Equals(contractID)
        select new
        {
            Licencee = cc.IsLicencee,
            Added = cc.AddedDate,
            Firstname = cc.Customer.FirstName,
            Lastname = cc.Customer.LastName,
            DOB = cc.Customer.DateOfBirth,
            Postcode = cc.Customer.PostCode,
            CustomerNumber = cc.CustomerNumber,
            CustomerLockerHasCard = cc.Customer.CustomerLockers
                            .Where(x => x.LockerNumber == 1000)
                            .Select(x => x.HasCard)
        }
    )
    

    此外,我建议您将模型类定义为已知类型,而不是使用匿名类型。

        2
  •  0
  •   Antoine Pelletier    6 年前

    一种选择是获取客户列表,而不仅仅是客户编号:

    var myCustomers = (from cc in context.ContractCustomers
    where cc.Contract_ID.Equals(contractID)
    select new
    {
        Licencee = cc.IsLicencee,
        Added = cc.AddedDate,
        Firstname = cc.Customer.FirstName,
        Lastname = cc.Customer.LastName,
        DOB = cc.Customer.DateOfBirth,
        Postcode = cc.Customer.PostCode,
        CustomerNumber = cc.CustomerNumber,
        listOfCustomers = cc.Customer.ToList() // <-Here, a list
    }
    )
    

    然后可以使用循环:

    foreach(var customer in myCustomers.listOfCustomers)
    {
        var listOfLockers = customer.CustomerLockers.ToList();
    }
    

    但这更像是一种初学者的方式,请记住,最好在一个查询中获取所需的所有内容,如Stormcloack的答案。

    这个答案只是为了向你展示你如何用最简单的方法挖掘实体。