C# 4.0 高效的LINQ到实体查询案例?

C# 4.0 高效的LINQ到实体查询案例?,c#-4.0,linq-to-entities,C# 4.0,Linq To Entities,在这个例子中,我需要一些帮助来重构一个好的查询,以便从SQLServer数据库中获取数据 例如,假设您有一个包含20000首歌曲的数据库,每首歌曲有6个字段,每个字段都是一个类别(例如Category1=舞蹈,Category2=房子,Category3=深,Category4=最小,Category5=空,Category6=空) 当你想得到《舞蹈与房子》中所有的歌曲,但其他类别的歌曲都无关紧要时,你会怎么做?或是深沉而渺小,其他都不重要 我可以说哪些类别的问题 我可以想象一种有很多组合的方法

在这个例子中,我需要一些帮助来重构一个好的查询,以便从SQLServer数据库中获取数据

例如,假设您有一个包含20000首歌曲的数据库,每首歌曲有6个字段,每个字段都是一个类别(例如Category1=舞蹈,Category2=房子,Category3=深,Category4=最小,Category5=空,Category6=空)

当你想得到《舞蹈与房子》中所有的歌曲,但其他类别的歌曲都无关紧要时,你会怎么做?或是深沉而渺小,其他都不重要

我可以说哪些类别的问题

我可以想象一种有很多组合的方法……感觉非常难看……

我的例子:

(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));
我不知道代码是否运行^^


祝你好运

您可以在纯SQL中使用如下查询来完成任务:

SELECT * FROM Songs
WHERE 'Dance' IN (Category1,Category2,Category3,Category4,Category5,Category6)
AND 'House'   IN (Category1,Category2,Category3,Category4,Category5,Category6)
但据我记忆所及,LINQtoEntities不支持中的
,所以您需要其他东西


另一种在EF4.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);