C# EF一对多where条件
我使用实体框架生成了以下两个类C# EF一对多where条件,c#,.net,entity-framework,linq,C#,.net,Entity Framework,Linq,我使用实体框架生成了以下两个类 public class Persons { public string Name { get; set; } public int personId { get; set; } //NAVIGATIONL PROP. public virtual ICollection<streetLivedIn> { get; set; } } public class StreetLivedIn {
public class Persons
{
public string Name { get; set; }
public int personId { get; set; }
//NAVIGATIONL PROP.
public virtual ICollection<streetLivedIn> { get; set; }
}
public class StreetLivedIn
{
public string Address1 { get; set; }
public string AddressType { get; set; }
//NAVIGATIONL PROP.
public virtual PersonId (Foriegn Key with Person)
}
上面的代码在where子句中抛出一个错误,表示它无法将ICollection
转换为streetlivedin
类
我想知道如何使用Include和where.以及Persons上下文来实现这一点。(我知道使用streetLivedIn上下文很容易实现。)。。
像
(请不要使用join语句)
如果您不需要特定的用户地址
var Lstpersons=(from s in db.streetlivedins where s.AddressType == "Home" select s).ToList();
如果你想要人
var Lstpersons=(from p in db.persons let st =p.streetlivedins from s in st where s.AddressType == "Home" select p).ToList();
如果您不需要特定的用户地址
var Lstpersons=(from s in db.streetlivedins where s.AddressType == "Home" select s).ToList();
如果你想要人
var Lstpersons=(from p in db.persons let st =p.streetlivedins from s in st where s.AddressType == "Home" select p).ToList();
您正在尝试查找
streetlivedin.AddressType==“Home”
的位置,但streetlivedin
是person实体的集合。相反,请在streetlivedin
上执行子查询,例如:
var Lstpersons = db.persons()
.Include(x => x.streetlivedin)
.Where(x => x.streetlivedin.Any(y=>y.AddressType == "Home"));
您正在尝试查找
streetlivedin.AddressType==“Home”
的位置,但streetlivedin
是person实体的集合。相反,请在streetlivedin
上执行子查询,例如:
var Lstpersons = db.persons()
.Include(x => x.streetlivedin)
.Where(x => x.streetlivedin.Any(y=>y.AddressType == "Home"));
要让所有人都只知道自己的家庭地址,您可能需要这样的查询
from person in db.persons()
join address in db.streetlivedin() on person.personId equals address.PersonId
where address.AddressType == "Home"
select new { Person = person, HomeAddress = address }
当然,由于这是一个内部连接,任何拥有一个以上家庭地址的人都会在结果中出现不止一次
顺便说一句,如果我必须使用这个代码库,混合大写会让我发疯。你不必遵循C#编码惯例,但如果你要选择自己的惯例,至少要保持一致。要让所有人都只知道他们的家庭地址,你需要这样的查询
from person in db.persons()
join address in db.streetlivedin() on person.personId equals address.PersonId
where address.AddressType == "Home"
select new { Person = person, HomeAddress = address }
当然,由于这是一个内部连接,任何拥有一个以上家庭地址的人都会在结果中出现不止一次
顺便说一句,如果我必须使用该代码库,混合大小写会让我发疯。你不必遵循C#编码约定,但如果你要选择自己的约定,至少要使其一致。因此你可以使用
.Include()
,但不能使用.Join()
?想解释一下原因吗?@DavidL我们在其余的代码功能中使用了Include。为了保持一致性…所以您可以使用。Include()
,但不使用。Join()
?想解释一下原因吗?@DavidL我们在其余的代码功能中使用Include。因此,为了保持一致性……正如我在帖子前面提到的……我不想使用db.streetlivedins……我想通过Include station实现使用db.persons,而不是“from..in..join..”这很奇怪,为什么你不想使用db.streetlivedins
,不使用它不会得到任何好处,所以使用include
或父表的一致性有点荒谬。你应该关注体系结构和存储库的一致性,而不是这个。@AD.Net Iam为每个模型使用存储库类。我已经有了ady为其他功能实例化了person repository类。我不想仅仅为了这个而实例化StreetLivedIn repository类…所以我正在尝试看看是否可以使用person repository类,正如我在文章前面提到的那样..我不想使用db.streetlivedins…我想使用db.persons来实现这一点,还有include STATANT..不是“从..加入..”这很奇怪,为什么你不想使用db.streetlivedins
,不使用它不会得到任何好处,所以使用include
或父表的一致性有点荒谬。你应该关注体系结构和存储库的一致性,而不是这个。@AD.Net Iam为每个模型使用存储库类。我已经有了ady为其他功能实例化了persons repository类。我不想仅为此实例化StreetLivedIn repository类…因此,我正在尝试查看是否可以使用person repository类实现。它不会“any”返回不在家的地址类型…以及home address类型?any
返回项目的bool这与表达式匹配,因此只要此人的家中有一个streetlivedin
,它就会返回此人。或者您只是在每个人的家庭地址之后?我需要此人以及streetlivedin详细信息。tooThis应该返回带有该streetlivedin
记录的人。Steve的回答是正确的。查询将返回所有有“家”的人地址,但每个匹配的Person对象将包括与该人关联的所有地址。“any”不也返回不在家的地址类型吗?any
为匹配表达式的项目返回bool,因此只要该人有一个streetlivedin
的家,它就会返回该peperson.或者你只是在每个人的家庭地址之后?我需要每个人以及streetLivedIn详细信息。tooThis应该返回带有streetLivedIn
记录的人。Steve的回答是正确的。查询将返回所有有“家”的人地址,但每个匹配的Person对象将包括与该人员关联的所有地址。