C# 在LINQ to SQL中按导航属性(子对象)筛选查询的最佳方法

C# 在LINQ to SQL中按导航属性(子对象)筛选查询的最佳方法,c#,performance,entity-framework,linq,linq-to-sql,C#,Performance,Entity Framework,Linq,Linq To Sql,我有两个选项来过滤我的查询: var users = query.Select(x => x.User).FindUsers(searchString); query = query.Where(x => users.Contains(x.User)); 或 FindUsers的说明扩展: static IQueryable<User> FindUsers(this IQueryable<User> query, string searchString);

我有两个选项来过滤我的查询:

var users = query.Select(x => x.User).FindUsers(searchString);
query = query.Where(x => users.Contains(x.User));

FindUsers的说明
扩展:

static IQueryable<User> FindUsers(this IQueryable<User> query, string searchString);
静态IQueryable FindUsers(此IQueryable查询,字符串搜索字符串);
那么,我最终将在SQL中得到什么呢?这两个请求中哪一个更适合性能?
如果有人有其他建议,请写下来回答


提前谢谢

两个查询在EF v6或更高版本中相似;Contains条件将转换为SqlEXISTS

将战利品带到以下代码:

 using (var dbContext = new DbContextTest("DatabaseConnectionString"))
  {
    var users = dbContext.Users.Select(u => u).Where(x => x.UserId > 0);
    var query = dbContext.Users.Where(x => users.Contains(x));
    Console.WriteLine(query.ToList());
  }

  using (var dbContext = new DbContextTest("DatabaseConnectionString"))
  {
    var ids = dbContext.Users.Select(u => u.UserId).Where(x => x > 0);
    var query = dbContext.Users.Where(x => ids.Contains(x.UserId));
    Console.WriteLine(query.ToList());
  }
输出Sql查询完全相同(您可以使用探查器或EF logger查看)。有一件事可能很重要,仅选择Id将更灵活地实现物质化和缓存

提示: 如果在Ids查询dbContext.Users.Select(u=>u.UserId).Where(x=>x>0.ToList()中添加ToList();然后此修复将提高您的结果性能。下一个select查询将在中使用SQL“”而不是“EXISTS”进行转换!看看这个链接,你可以决定什么对你更好

注意:
ToList()将具体化Id,这意味着您将使用另一个接口,然后IQueryable

谢谢你的回复!
 using (var dbContext = new DbContextTest("DatabaseConnectionString"))
  {
    var users = dbContext.Users.Select(u => u).Where(x => x.UserId > 0);
    var query = dbContext.Users.Where(x => users.Contains(x));
    Console.WriteLine(query.ToList());
  }

  using (var dbContext = new DbContextTest("DatabaseConnectionString"))
  {
    var ids = dbContext.Users.Select(u => u.UserId).Where(x => x > 0);
    var query = dbContext.Users.Where(x => ids.Contains(x.UserId));
    Console.WriteLine(query.ToList());
  }