我有一个包含两个实体A和B的数据库.A和B之间有多对多的关系(还有一个AB表也会自动创建以实现这一点)。 A有A_prop(键),B有B_prop(键)。
我想,在给定一个特定的B_prop的情况下,找到B的关系中的所有A,(对于相应的导航属性称为Ayes和Bees),具有特定B_prop的B。
所以我有这段代码:
public class Repository
{
private ABEntities entities = new ABEntities();
public IQueryable<A> FindAllA(string b_prop)
{
return from b in entities.Bs
where b.B_prop == b_prop
select b.Ayes;
}
}
此处的返回类型不匹配。我真正想要的是有一个A的列表,或类似的东西,我可以用以下方式:
List<A> listofa = repository.FindAllA("some string");
foreach (A a in listofa)
{
// Do my stuff here.
}
编辑:
感谢您的回复。这是我的问题的解决方案(测试):
public List<A> FindAllA(string b_prop)
{
return (from b in entities.Bs
where b.B_prop == b_prop
select b.Ayes).First().ToList();
}
答案 0 :(得分:1)
public class Repository { private ABEntities entities = new ABEntities(); public IList<A> FindAllA(string b_prop) { return (from b in entities.Bs where b.B_prop == b_prop select b.Ayes).ToList(); } }
我强烈建议您不要从存储库返回可查询的内容,因为每个可查询的实现都不同(linq / entities / sql / etc)
答案 1 :(得分:1)
不要在初始子集上调用.First
,而是考虑使用SelectMany
展平您的结果集:
public List<A> FindAllA(string b_prop)
{
return (from b in entities.Bs
where b.B_prop == b_prop
from a in b.Ayes
select a).ToList();
}
这种方式如果由于某种原因你在Bs表中有多个匹配的记录,那么将返回所有相关的As,而不仅仅是第一个匹配到你的第一个B结果的集合。您第一次尝试的问题是您返回的是IQueryable<EntitySet<Ayes>>
而不是IQueryable<Ayes>
。 SelectMany
使这种关系变得平坦。
答案 2 :(得分:0)
LINQ查询通常返回iQueryable<type>
。您可以通过执行以下操作将其转换为列表:
return (from b in entities.Bs
where b.B_prop == b_prop
select b.Ayes).ToList();
在你的功能中。
答案 3 :(得分:0)
你有一个IQueryable,而另一个不匹配只返回应该有效的List<A>