// SELECT * FROM [Photos] WHERE Tags LIKE '%人物%' var query = from p in Photos where p.Tags.Contains("人物") select p;
稍微增加点复杂度,只查询本年度的照片:
1 2 3 4 5
// SELECT * FROM [Photos] WHERE CreationTime >= '2019-01-01' AND Tags LIKE '%人物%' var creationTime = new DateTime(DateTime.Now.Year, 1, 1); var query = from p in Photos where p.CreationTime >= creationTime && p.Tags.Contains("人物") select p;
查询本年度带有 “人物” 并且 带有 “风景” 标签的数据:
1 2 3 4 5
// SELECT * FROM [Photos] WHERE CreationTime >= '2019-01-01' AND (Tags LIKE '%人物%' AND Tags LIKE '%风景%') var creationTime = new DateTime(DateTime.Now.Year, 1, 1); var query = from p in Photos where p.CreationTime >= creationTime && (p.Tags.Contains("人物") && p.Tags.Contains("风景")) select p;
查询本年度带有 “人物” 或者 带有 “风景” 标签的数据:
1 2 3 4 5
// SELECT * FROM [Photos] WHERE CreationTime >= '2019-01-01' AND (Tags LIKE '%人物%' OR Tags LIKE '%风景%') var creationTime = new DateTime(DateTime.Now.Year, 1, 1); var query = from p in Photos where p.CreationTime >= creationTime && (p.Tags.Contains("人物") || p.Tags.Contains("风景")) select p;
如果搜索条件是动态的,要查询本年度带有 “人物” 并且 带有 “风景” 标签的数据:
1 2 3 4 5 6 7
// SELECT * FROM [Photos] WHERE CreationTime >= '2019-01-01' AND (Tags LIKE '%人物%' AND Tags LIKE '%风景%') var creationTime = new DateTime(DateTime.Now.Year, 1, 1); var searchTags = new [] {"人物", "风景"}; IQueryable<Photo> query = Photos.Where(m => m.CreationTime >= creationTime); for(var tag in searchTags) { query = query.Where(m => m.Tags.Contains("人物")) }
如果搜索条件是动态的,要查询本年度带有 “人物” 或者 带有 “风景” 标签的数据,又如何构造查询呢?因为多个 where 是 And 查询,所以不能直接使用上例所示的方式构造查询。 首先,写一个扩展方法 (Extension method):
// SELECT * FROM [Photos] WHERE CreationTime >= '2019-01-01' AND (Tags LIKE '%人物%' OR Tags LIKE '%风景%') var creationTime = new DateTime(DateTime.Now.Year, 1, 1); var searchTags = new [] {"人物", "风景"}; var query = Photos.Where(m => m.CreationTime >= creationTime).WhereOrStringContains(m => m.Tags, searchTags);
三、Collection、Any 和 Equal(Deprecated)
现在将照片和标签分离,使用一个中间结构形成多对多的关系。 查询带有 “人物” 标签的数据:
1 2 3 4 5 6 7 8 9
/* SELECT * FROM [Photos] AS P WHERE EXISTS ( SELECT 1 FROM [PhotoTags] AS PT WHERE PT.TagId = 1 AND P.PhotoId = PT.PhotoId) */ var tagId = 1; var query = Photos.Where(m => m.PhotoTags.Any(n => n.TagId = tagId));