Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于MSSQL或LINQ中的单列选择不常见的行_Sql_Sql Server_Linq_Tsql_Sql Query Store - Fatal编程技术网

基于MSSQL或LINQ中的单列选择不常见的行

基于MSSQL或LINQ中的单列选择不常见的行,sql,sql-server,linq,tsql,sql-query-store,Sql,Sql Server,Linq,Tsql,Sql Query Store,我想选择一个在管理员和超级管理员角色之间不常见的API_路径 ╔════════╦═════════════════════╦═════════════╗ ║ API_ID ║ API_PATH ║ ROLE_NAME ║ ╠════════╬═════════════════════╬═════════════╣ ║ 1 ║ /objects/Types ║ Super Admin ║ ║ 2 ║ /objects/Types

我想选择一个在管理员和超级管理员角色之间不常见的API_路径

╔════════╦═════════════════════╦═════════════╗
║ API_ID ║      API_PATH       ║  ROLE_NAME  ║
╠════════╬═════════════════════╬═════════════╣
║      1 ║ /objects/Types      ║ Super Admin ║
║      2 ║ /objects/Types      ║ Admin       ║
║      3 ║ /organization/list  ║ Super Admin ║
║      4 ║ /objects/Types/6498 ║ Super Admin ║
║      5 ║ /objects/Types/6498 ║ Admin       ║
╚════════╩═════════════════════╩═════════════╝
预期结果应为:

╔════════╦════════════════════╦═════════════╗
║ API_ID ║      API_PATH      ║  ROLE_NAME  ║
╠════════╬════════════════════╬═════════════╣
║      3 ║ /organization/list ║ Super Admin ║
╚════════╩════════════════════╩═════════════╝

在上面的/organization/list中,只有API_路径在两个角色中不常见,我需要使用角色名称选择API_路径。在没有硬编码的情况下,如何使用MSSQL或LINQ执行此操作?

如果添加常量字符串,它应该非常简单,如:

SELECT 
    API_ID, 
    API_PATH, 
    ROLE_NAME 
FROM #Results
WHERE 
    API_PATH NOT LIKE '/objects/Types1%'
    AND API_PATH NOT LIKE '/objects/Types2%'
    AND API_PATH NOT LIKE '/objects/Types3%'
结果:

关于:

SELECT 
    API_PATH 
FROM #Results
GROUP BY API_PATH
HAVING COUNT(API_PATH) = 1
结果:


假设
角色
列表
)包含要按其分组的角色,则此操作应有效:

var ans = db.Where(d => Roles.Contains(d.ROLE_NAME))
            .GroupBy(d => d.API_PATH)
            .Where(dg => dg.Count() == Roles.Count)
            .SelectMany(dg => dg);
根据LINQ to SQL/EF/EF Core的版本,您可能需要在
Where
后面添加一个
可计算的
,这将拖拽包含所需
角色的所有行。不幸的是,在例如EF Core 3.1中,没有复杂的
GroupBy
表达式的翻译(在这种情况下,无论如何也没有很好的SQL翻译)

这似乎与EF Core 3.1配合使用,但(可能)会在SQL端进行两次过滤:

var paths = db.Select(d => d.API_PATH)
              .Distinct()
              .Where(p => db.Where(d => Roles.Contains(d.ROLE_NAME) && d.API_PATH == p).Count() < Roles.Count);
var ans = db.Where(d => paths.Contains(d.API_PATH) && Roles.Contains(d.ROLE_NAME));
var PATH=db.Select(d=>d.API\u路径)
.Distinct()
.Where(p=>db.Where(d=>Roles.Contains(d.ROLE\u NAME)和&d.API\u PATH==p.Count()PATH.Contains(d.API_PATH)&&Roles.Contains(d.ROLE_NAME));

您的措辞中的“common”是指像“/objects/Types”这样的硬编码字符串还是完全动态的?具体来说:在所有5行中,“/o”是相等的,需要选择两个角色之间不常见的API_路径,没有硬编码什么?没有硬编码角色名或API路径我无法硬编码,因为我有数千个API路径,并且有多个角色名我没有解决方案。请参阅我的最新答案。但我想这不是你想要的。我可以看到输出,但问题是我的角色是动态的,我需要在查询中包括角色,因为我有多个roles@vijaymadishetti一个简单的
,其中
应该处理。。。?