【问题标题】:C# / LINQ - having trouble querying database with LINQC#/LINQ - 使用 LINQ 查询数据库时遇到问题
【发布时间】:2011-09-27 18:18:55
【问题描述】:

我有一个包含两个实体 A 和 B 的数据库。A 和 B 在它们之间具有多对多关系(还有一个 AB 表也是自动创建的以实现这一点)。 A 有 A_prop(key),B 有 B_prop(key)。

我想,给定一个特定的 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();
}

【问题讨论】:

    标签: c# linq


    【解决方案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&lt;EntitySet&lt;Ayes&gt;&gt; 而不是IQueryable&lt;Ayes&gt;。 SelectMany 拉平了这种关系。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 我尝试运行您的代码,但出现以下错误:错误 1 ​​无法隐式转换类型 'System.Collections.Generic.List >' 到 'System.Collections.Generic.IList'。存在显式转换(您是否缺少演员表?)
      • 好的,如果我这样做,它会起作用...选择 b.Ayes.ToList()).First();因为给定的 b_prop 只有一个 b 并且那些 Ayes 将在一个列表中(一旦投射),这将在某个 EntityCollection 中,但将是列表中的唯一项目。
      • @Cubicle.Jockey ya or - enumerable or list 都可以。我的实现选择列表是因为我喜欢列表,但个人选择取决于应用程序/api 要求。这里的重点是避免 Iqueryable。
      • @pkr298 您是否在实体框架生成的类之外定义了一个单独的 Database.A 类?
      【解决方案3】:

      LINQ 查询通常返回iQueryable&lt;type&gt;。您可以通过以下方式将其转换为列表:

              return (from b in entities.Bs
                     where b.B_prop == b_prop
                     select b.Ayes).ToList();
      

      在你的函数中。

      【讨论】:

        【解决方案4】:

        你有一个 IQueryable 和另一个之前不匹配只需返回 List&lt;A&gt; 应该可以工作

        【讨论】:

          猜你喜欢
          • 2013-03-10
          • 1970-01-01
          • 1970-01-01
          • 2011-03-16
          • 1970-01-01
          • 1970-01-01
          • 2018-04-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多