使用 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 的回答。
此答案只是为了向您展示如何以简单的方式挖掘实体。
首先,我是 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 的回答。
此答案只是为了向您展示如何以简单的方式挖掘实体。