我遇到这种情况,我需要一些帮助来重构一个好的查询来从SQL Server数据库中获取数据。
案例是你有一个拥有20000首歌曲的数据库,每首歌曲有6个字段,每个字段都是一个类别(例如,Category1 = Dance,Category2 = House,Category3 = Deep,Category4 = Minimal,Category5 = null,Category6 =空)。
当你想要获得Dance和House中的所有歌曲而不是所有其他类别的歌曲时,你会如何处理?或者深度和极小,并不重要所有其他?
我可以说要问哪些类别!
我可以想象一种有很多组合的方法......它感觉真的很难看......
答案 0 :(得分:0)
我的例子:
(from song in SongRepository
where song.Cateroy1 == Dance || song.Cateroy2 == Dance || song.Cateroy3 == Dance || song.Cateroy4 == Dance || song.Cateroy5 == Dance
select song)
.Union(from song in SongRepository
where song.Cateroy1 == House || song.Cateroy2 == House || song.Cateroy3 == House || song.Cateroy4 == House || song.Cateroy5 == House
select song)
这个解决方案很糟糕。 我的意见是,你的数据库不好,。看看如何加入和关联表
table Song
SongID
SongTitle
SongCategoryID
table Category
CategoryID
CategoryTitle
table SongCategory
SongCategoryID
SongID
CategoryID
和您的linq请求:
SongRepository.Where(song => song.SongCategory.Category.CategoryTitle = "Dance"
|| song.SongCategory.Category.CategoryTitle = "House").Select(song =>song);
或动态请求
var query = SongRepository.Where(song => song.SongCategory.Category.CategoryTitle = "Dance").Select(song =>song);
query = query.Union(SongRepository.Where(song => song.SongCategory.Category.CategoryTitle = "House").Select(song =>song));
我不知道代码是否运行... ^^
祝你好运!答案 1 :(得分:0)
您可以在纯SQL中使用这样的查询来完成您的任务:
SELECT * FROM Songs
WHERE 'Dance' IN (Category1,Category2,Category3,Category4,Category5,Category6)
AND 'House' IN (Category1,Category2,Category3,Category4,Category5,Category6)
但据我记得,Linq-to-entities不支持IN
,所以你还需要别的东西。
另一种半hacky方法应该适用于EF 4.0(这里我假设#
是一个永远不会出现在你的类别名称中的符号)
var result = Songs
.Select(s => new {Name = s.Name, SearchString = '#'+s.Category1+'#'+s.Category2+'#'+...+'#'})
.Where(p => p.SearchString.Contains("#Dance#") && p.SearchString.Contains("#House#"))
.Select(p => p.Name);
最后一个解决方案 - 规范化您的数据库。