C#/ LINQ - 用LINQ查询数据库时遇到问题

时间:2011-09-27 18:18:55

标签: c# linq

我有一个包含两个实体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();
}

4 个答案:

答案 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>