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());
}