Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF一对多where条件_C#_.net_Entity Framework_Linq - Fatal编程技术网

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对象将包括与该人员关联的所有地址。