【问题标题】:LINQ to entities comparing collectionsLINQ to 实体比较集合
【发布时间】:2011-11-09 08:01:23
【问题描述】:

我遇到了一个 Linq 查询问题,该查询实际上可以满足我的需要。我构建了一个需要在数据库(实体框架)中查找文章的搜索,然后搜索使用复选框列表来允许用户仅在某些实践领域内进行搜索。我看过关于 linq joins & multiple collections 的帖子,但我的问题是我试图从中选择的是父表文章,我需要将 .Practices 与我从复选框列表中编译的实践列表进行比较.

在它是一个复选框列表之前,它是一个下拉列表,此查询用于搜索 1 个实践:

ar = (from a in db.Articles
      from p in a.Practices
      where p.ID == practiceID
      select a);

现在,我需要 where 子句像常规 SQL 中的“IN”一样工作。我的从复选框列表编译的实践集合需要与 db.Articles.Practices 进行比较以进行搜索。

需要任何建议或澄清吗?

【问题讨论】:

    标签: c# .net linq asp.net-mvc-3


    【解决方案1】:

    假设:列出 practiceIds

    ar = (from a in db.Articles
      from p in db.Practices
      where practiseIds.Contains(p.ID)
      select a);
    

    不过需要澄清一下:

    IN 不是 EF 中支持的第一类 SQL 方法,因此上面的代码实际上会变成 or 的列表(这可能已在 EF 的 .net 4 版本中解决 - http://blogs.msdn.com/b/adonet/archive/2009/08/05/improvements-to-the-generated-sql-in-net-4-0-beta1.aspx

    伪代码 -

    Select * From db.Articles 
    inner join db.Practices on <relation>
    Where db.Practices.practiceid = @p0 || db.Practices.practiceid = @p1 || etc..
    

    【讨论】:

    • 顺便说一句,两者都应该在 SQL 中生成相同的查询计划
    • 两个答案都是一样的......这个是第一个,所以得到了检查。是的,这行得通......我是 Linq 的新手,所以感谢菜鸟。
    【解决方案2】:

    只需将 id 集合作为数组 practiceIds 传入并使用 Contains() 查询:

    ar = (from a in db.Articles
          from p in a.Practices
          where practiceIds.Contains(p.ID)
          select a);
    

    【讨论】:

    • 只要两个集合都来自相同的查询上下文,这将起作用。如果practiceIds 在内存上下文中并且db.Articles 从数据上下文中提取,它将引发运行时异常。为了解决这个问题,ar 需要提取 where 子句并发送ToList()。一旦它是 IEnumerable 而不是 IQueryable,就可以将序列与.Where(x =&gt; practiceIds.Contains(x.ID)) 进行比较。 +1 顺便说一句:)
    • @JoelEtherton:我假设它只是一组根本没有连接到数据上下文的原语 - OP 说他有一组从复选框编译的 id
    • 即使是原语也会抛出这个异常:stackoverflow.com/questions/3985622/…
    • 谢谢,它有效...我给了另一个人先回答的支票。我曾尝试过类似的事情,但不完全是这样。保重。
    猜你喜欢
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2011-04-05
    • 2021-12-18
    • 2014-02-12
    • 1970-01-01
    相关资源
    最近更新 更多