高效的LINQ to Entities查询案例?

时间:2011-03-23 21:20:30

标签: c#-4.0 linq-to-entities

我遇到这种情况,我需要一些帮助来重构一个好的查询来从SQL Server数据库中获取数据。

案例是你有一个拥有20000首歌曲的数据库,每首歌曲有6个字段,每个字段都是一个类别(例如,Category1 = Dance,Category2 = House,Category3 = Deep,Category4 = Minimal,Category5 = null,Category6 =空)。

当你想要获得Dance和House中的所有歌曲而不是所有其他类别的歌曲时,你会如何处理?或者深度和极小,并不重要所有其他?

我可以说要问哪些类别!

我可以想象一种有很多组合的方法......它感觉真的很难看......

2 个答案:

答案 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);

最后一个解决方案 - 规范化您的数据库。