实体框架根据集合查询和过滤

时间:2015-01-13 16:11:12

标签: c# linq entity-framework

我需要一个非常简单的查询,可以用sql编写,但我无法使用Entity Framework编写它。

请求: 我有一个文件夹表,我需要获得" 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上,但我不确定它是否可以。

1 个答案:

答案 0 :(得分:1)

它确实可以用LINQ编写,如下:

var portalCodes = lst.Select(f => f.PortalCode).Distinct();
var folders = dbContext.Folders.Where(f => portalCodes.Any(p => f.FullPath.Contains(p)));