使用 C# 和导航属性查询 Entity Framework

Query Entity Framework using C# and Navigation Properties

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

我在 VS 2015 CE 中使用模型设计器创建了许多实体并设置了关系。

我想查询实体 return 特定合同的所有客户(例如 Contract_ID = 1),以及来自 CustomerLocker 和 ContractCustomer 实体的相关属性(对于 CustomerLocker如果存在则为实体,如果不存在则为空)。我还有来自 Contract 实体的 LockerNumber 值(例如 100)。

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

到目前为止,我能够 select 客户,但无法 select 来自 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

您可以通过对 LockerNumber;

进行过滤从 CustomerLockers 中获取 HasCard
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)
    }
)

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

一个选项是获取客户列表而不仅仅是客户编号:

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 的回答。

此答案只是为了向您展示如何以简单的方式挖掘实体。