Entity Framework根据集合查询过滤
Entity Framework query and filter according to a collection
我需要一个非常简单的查询,可以很容易地用 sql 编写,但我无法使用 Entity Framework.
编写它
要求:
我有一个文件夹 table,我需要获取 "FullPath" 包含存储在内存集合中的以下单词的文件夹。
Folder Table:
Id Name FullPath
06D5DA4D Settings Root/Portals/aaa/Version1PRD/Settings
0AF5C112 Settings Root/Portals/bbb/Version1STG/Settings
E2A989BB Settings Root/Portals/ccc/Version1/Settings
B019A05D Settings Root/Portals/ddd/Version1STG/Settings
我的申请清单。
List<FolderViewModel> lst = new List<FolderViewModel>();
lst.Add(new FolderViewModel{PortalCode="aaa"});
lst.Add(new FolderViewModel{PortalCode="bbb"});
我想要做的是使用 linq 获得如下 sql 语句。
SELECT TOP 100 Id,Name,F.FullPath
FROM Folder F
INNER JOIN (
SELECT 'aaa' AS Code
UNION
SELECT 'bbb'
) AS P ON F.FullPath LIKE 'Root/Portals/' + P.Code + '/%/Settings'
这将导致
Id Name FullPath
06D5DA4D Settings Root/Portals/aaa/Version1PRD/Settings
0AF5C112 Settings Root/Portals/bbb/Version1STG/Settings
我无法想象如何编写像上面这样的查询,也许这不能在 linq 上写,但我不确定它是否可以。
确实可以用LINQ来写,如下:
var portalCodes = lst.Select(f => f.PortalCode).Distinct();
var folders = dbContext.Folders.Where(f => portalCodes.Any(p => f.FullPath.Contains(p)));
我需要一个非常简单的查询,可以很容易地用 sql 编写,但我无法使用 Entity Framework.
编写它要求: 我有一个文件夹 table,我需要获取 "FullPath" 包含存储在内存集合中的以下单词的文件夹。
Folder Table:
Id Name FullPath
06D5DA4D Settings Root/Portals/aaa/Version1PRD/Settings
0AF5C112 Settings Root/Portals/bbb/Version1STG/Settings
E2A989BB Settings Root/Portals/ccc/Version1/Settings
B019A05D Settings Root/Portals/ddd/Version1STG/Settings
我的申请清单。
List<FolderViewModel> lst = new List<FolderViewModel>();
lst.Add(new FolderViewModel{PortalCode="aaa"});
lst.Add(new FolderViewModel{PortalCode="bbb"});
我想要做的是使用 linq 获得如下 sql 语句。
SELECT TOP 100 Id,Name,F.FullPath
FROM Folder F
INNER JOIN (
SELECT 'aaa' AS Code
UNION
SELECT 'bbb'
) AS P ON F.FullPath LIKE 'Root/Portals/' + P.Code + '/%/Settings'
这将导致
Id Name FullPath
06D5DA4D Settings Root/Portals/aaa/Version1PRD/Settings
0AF5C112 Settings Root/Portals/bbb/Version1STG/Settings
我无法想象如何编写像上面这样的查询,也许这不能在 linq 上写,但我不确定它是否可以。
确实可以用LINQ来写,如下:
var portalCodes = lst.Select(f => f.PortalCode).Distinct();
var folders = dbContext.Folders.Where(f => portalCodes.Any(p => f.FullPath.Contains(p)));