C# 按相关表计数筛选查询
我正在尝试获取数据库中至少有一个家庭成员的人的列表C# 按相关表计数筛选查询,c#,entity-framework-6,C#,Entity Framework 6,我正在尝试获取数据库中至少有一个家庭成员的人的列表 FamilyMembers是一个相关表,由一对多外键绑定 [1]个人.PersonId-->[0或更多]家庭成员.PersonId 我尝试过这样做,但是Count()似乎不像我想象的那样工作。 我得到的结果同时包含0个和更多家庭成员 public IEnumerable<Person> GetPeopleWithFamilyMembers() { IQueryable<Person> query = Contex
FamilyMembers
是一个相关表,由一对多外键绑定
[1]个人.PersonId-->[0或更多]家庭成员.PersonId
我尝试过这样做,但是Count()
似乎不像我想象的那样工作。
我得到的结果同时包含0个和更多家庭成员
public IEnumerable<Person> GetPeopleWithFamilyMembers()
{
IQueryable<Person> query = Context.Persons;
query = query.OrderBy(x => x.FamilyMembers.Count());
query = query.Where(x => x.FamilyMembers.Count() > 0);
// Execute query and return result:
return query.Select(x => x);
}
public IEnumerable GetPeopleWithFamilyMembers()
{
IQueryable query=Context.Persons;
query=query.OrderBy(x=>x.FamilyMembers.Count());
query=query.Where(x=>x.FamilyMembers.Count()>0);
//执行查询并返回结果:
返回查询。选择(x=>x);
}
我真的不知道该怎么办:-/我努力寻找一个不使用扩展查询表单的优雅解决方案 在SQL中实现这一点的唯一方法是使用Group By和Join,但我不知道是否正确地将其转换为LINQ。请随意指出我的错误
var query = Persons
.Join(FamilyMembers,
p => p.Id,
f => f.Id,
(p,f) => new { Person = p, FamilyMembers = f }
)
.GroupBy(g => g.FamilyMembers)
.Where(w => w.FamilyMembers.Count() > 0);
.Select(x => new {
Person = x.Person,
FamilyMembers = x.Count(y => y.FamilyMembers)
}
);
仅供参考,当使用方法语法时,您不需要
Select(x=>x)
。我知道,我把它放在那里是为了提醒自己,我以后需要处理它:-)在复制/粘贴它时忘记删除它。为什么不在OrderBy
之前合并那些Where
子句?如。其中(x=>x.Deleted!=true&&x.FamilyMembers.Count()>0)
。我将删除已删除的!=此处代码的真实部分,因为它与问题无关。@Michael,当EF为您提供了很好的导航属性时,为什么要浪费时间加入呢?我尝试过这个,但出于某种原因,它不喜欢Where子句中的w.FamilyMembers
。表示igroupping'不包含“FamilyMembers”的定义,并且找不到接受第一个“igroupping”类型参数的扩展方法“FamilyMembers”(您是否缺少using指令或程序集引用?
目前,不幸的是,我没有时间了,不得不这样做。希望以后回来用正确的方法解决这个问题。这不是我最自豪的时刻query=Context.Persons.SqlQuery(“从[dbo].[People]p中选择*从[dbo].[FamilyMembers]f中选择计数(*),其中f.[PersonId]=p.[PersonId]和(f.[Deleted]=0或f.[Deleted]为NULL))>0”).AsQueryable()代码>