【问题标题】:Entity Framework: SELECT From Where ID NOT IN实体框架:SELECT From Where ID NOT IN
【发布时间】:2018-03-11 14:40:40
【问题描述】:

我知道这可能是一个简单的问题,但我花了好几个小时试图弄清楚但没有运气!

我想在Entity Framework中实现如下SQL命令:

SELECT * FROM Table1
WHERE RowID NOT IN (
SELECT SomeID FROM Table2 Where SomeID is not null)

我尝试了以下(Asp.Net C#):

var SomeIDs = db.Table2.Where(n => n.SomeID != null).Select(x => x.SomeID);
var query = (from a in db.Table1
             where !(SomeIDs.Contains(a.RowID))
             select a;

它在小型数据库中工作正常,但在生产数据库中它需要永远然后超时!

感谢任何帮助!

【问题讨论】:

  • 为此生成了什么 SQL?
  • 让我猜猜,在生产中SomeIDs 包含更多项目。
  • LINQ 查询应该生成完全相同的NOT IN 或等效的NOT EXISTS SQL 查询。你能显示query.ToString()的输出吗?

标签: c# asp.net sql-server entity-framework


【解决方案1】:

尝试使用AsNoTracking,如果您不使用返回的对象来更新数据库中的数据,它可能会对您有所帮助

Table1.where(x => !someIds.conatins(x.id)).AsNoTracking();

【讨论】:

  • 我认为你的答案是我的解决方案,因为在我添加了 .AsNoTracking();即使在实时数据库中,它也确实变得更快!谢谢你:)
  • @AKO 很高兴听到这个消息:)
【解决方案2】:

您是否尝试过使用 .DefaultIfEmpty(), as per this question

var query = from a in db.Table1
            join b in SomeIDs
                on a.RowID equals b.SomeID into c
            from b in c.DefaultIfEmpty()
            where b == null
            select a;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2010-11-03
    • 2022-11-12
    相关资源
    最近更新 更多