【问题标题】:It is possible combining two linq queries into one?可以将两个 linq 查询合二为一吗?
【发布时间】:2021-06-02 10:00:33
【问题描述】:

我的数据库中有一个表(用户),看起来像这样(带有示例数据的表结构):

每个用户都有一个唯一的 IdUser,而多个用户可以拥有相同的 IdLicense。我想在一个查询列表中选择仅使用 IdUser 的具有相同 IdLicense 的所有用户。我使用两个 linq 查询来做到这一点:

 //Get logged user IdUser
 var claims = User.Identities.FirstOrDefault()?.Claims.FirstOrDefault()?.Value;

 //Get logged user IdLicense
 var license = _context.User.Where(x => x.IdUser == new Guid(claims))
               .Select(x => x.IdLicense).FirstOrDefault();

 //Get users with this license
 var users = _context.User.Where(x => x.IdLicense == license).ToList();

是否可以仅使用一个 linq 查询获得具有此许可证的相同用户列表?

【问题讨论】:

    标签: c# asp.net entity-framework linq


    【解决方案1】:

    这个应该很快工作:

    var userId = new Guid(claims);
    
    var query = 
       from ul in _context.Users
       where ul.IdUser == userId
       join u in _context.Users on ul.IdLicense equals u.IdLicense
       select u;
    
    var users = query.ToList();
    

    【讨论】:

    • 我检查了,你的代码在五次尝试中平均为 65 毫秒,Mohsen Esmailpour 代码平均为 75.6 毫秒。非常感谢您的建议:) 我的问题代码平均达到 158 毫秒
    • 没什么特别的,其他答案介绍了OUTER APPLY,操作不是那么快,在这种情况下不需要。
    【解决方案2】:

    一个解决方案可能是这样的:

    var userId = new Guid(claims);
    var users = (from user in _context.Users
                let licenseId = _context.User.Where(x => x.IdUser == userId)
                   .Select(x => x.IdLicense).FirstOrDefault();
                where user.IdLicense == licenseId).ToList();
    

    【讨论】:

    • 我稍微调整了您的代码(在查询末尾没有选择),它运行完美。谢谢
    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2012-06-06
    • 1970-01-01
    相关资源
    最近更新 更多