Эффективный случай запроса LINQ to Entities? - PullRequest
0 голосов
/ 24 марта 2011

У меня есть этот случай, когда мне нужна помощь по рефакторингу хорошего запроса для извлечения данных из базы данных SQL Server.

Случай, скажем, у вас есть база данных с 20000 песнями, и каждая песня имеет 6 полей скаждое поле является категорией (например, Категория1 = Танец, Категория2 = Дом, Категория3 = Глубина, Категория4 = Минимум, Категория5 = ноль, Категория6 = ноль).

Как вы подходите, когда хотите получить все песнито есть в Dance and House, но не имеет значения для всех других категорий?или Глубокий и Минимальный и не имеет значения для всех остальных?

Я могу сказать, какие категории запрашиваются!

Я могу представить подход, в котором много комбинаций .... и это действительно ощущаетсянекрасиво ...

Ответы [ 2 ]

0 голосов
/ 24 марта 2011

Вы можете использовать такой запрос в простом SQL для выполнения вашей задачи:

SELECT * FROM Songs
WHERE 'Dance' IN (Category1,Category2,Category3,Category4,Category5,Category6)
AND 'House'   IN (Category1,Category2,Category3,Category4,Category5,Category6)

но насколько я помню Linq-to-entity не поддерживает IN, поэтому вам понадобится что-то еще.


Еще один хакерский подход, который должен работать на 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);

И последнее решение - нормализовать вашу базу данных.

0 голосов
/ 24 марта 2011

Мой пример:

(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));

Не знаю, работает ли код ... ^^

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...