Так как в настоящее время нет SQL-клиента MS для Mac OS X, я, как Modesty предложил, использовал бы Удаленный рабочий стол для Mac
Это оказалось намного проще, чем казалось. Я решил проблему с помощью следующего сообщения в блоге: http: //weblogs.asp.
from ms in Context.MusicStyles
where ms.Bands.Any(b => b.Name.Contains(search))
select ms;
This just returns the style, which is what your question asks for. Your sample SQL, on the other hand, returns the style and the bands. For that, I'd do:
from b in Context.Bands
where b.Name.Contains(search)
group b by band.MusicStyle into g
select new {
Style = g.Key,
Bands = g
}
from b in Context.Bands
where b.Name.Contains(search)
select new {
BandName = b.Name,
MusicStyleId = b.MusicStyle.Id,
MusicStyleName = b.MusicStyle.Name,
// etc.
}
В Linq на самом деле вам не нужно ничего писать, если вы определяете отношение на диаграмме в базе данных SQL и генерируете с помощью утилиты, иерархия объектов строится автоматически. Это означает, что если вы это сделаете:
var bands = from ms in db.MusicStyle
let b = ms.Bands
where b.Name.Contains(SEARCHSTRING)
select new {
b.Name, ms.Name,
ms.ID, ms.Description};
Если вы посмотрите на сгенерированные классы сущностей, BandMusicStyle не должен отображаться, поскольку LINQ to Entities считает, что Band и MusicStyle много ко многим и эта таблица не нужна.
Посмотрим, работает ли?
Вы могли бы сделать то же самое, но это вернет все ваши результаты, как только вы начнете их перебирать, и фильтрация будет выполняться в памяти, а не в базе данных.
Я думаю вы ищете всего несколько соединений?
var q = from b in db.Bands
join bm in db.BandMusicStyle on on b.BandId equals bm.BandId
join ms in db.MusicStyle on bm.MusicStyleId equals m.MusicStyleId
where b.Name.Contains(searchString)
select new { b.Name, ms.ID, ms.Name, ms.Description };
или что-то в этом роде