2013-03-21 2 views
3

я (по крайней мере пытаюсь) осуществлять Repository pattern в моем .NET C# проекта поэтому, когда мне нужно взаимодействовать с базой данных I нам что-то вроде этого:Конкатенация два запросы база на внешнем ключ

IList<Sole> soles = SoleService.All().ToList(); 

Поскольку имя метода, вызванного службой, предлагает с запросом выше, я получаю все записи из таблицы Sole. Я не хочу, и я думаю, что это правильный способ реализовать этот шаблон, чтобы сохранить слишком много пользовательской логики в моем сервисе. Я имею в виду, что я хочу только сохранить метод All(), и каждая модификация результата будет сделана вне методов службы.

Текущая проблема в этом. У меня есть компания Sole и юридическое лицо SoleColor. SoleColor имеет столбец внешнего ключа SoleID, делающий соотношение между двумя таблицами. Сейчас для этих двух сущностей я могу назвать только All() метод:

var soleColors = SoleColorService.All(); 
var soles = SoleService.All(); 

Но здесь мне нужно некоторые настройки в виде выбора только те строки из Sole, которые связаны с SoleColor лица. Другими словами, заканчивается список только тех строк из Sole, где Sole.ID может быть найден как внешний ключ в SoleColor внешний ключ SoleID.

Сейчас я немного смущен - прошло некоторое время с тех пор, как я в последний раз использовал простой синтаксис SQL. Я думаю, что это легко достигается с помощью SQL и JOIN. Но когда LINQ участвует и мой опыт до сих пор говорит, что мне нужны эти два запроса:

var soleColors = SoleColorService.All(); 
var soles = SoleService.All(); 

А потом сделать какой-то РЕГИСТРИРУЙТЕСЬ/UNION фильтровать результаты только мне нужно.

Итак, какие инструменты мне нужно использовать в подобной ситуации, потому что это не единственное место, в котором я нуждаюсь в этом, и я хочу научиться делать это сам и, конечно, делать это в этой текущей ситуации?

+0

Вы используете ** ** LINQ to SQL или Entity Framework? В любом случае, как вы заметили, вы можете найти [IQueryable.Join] (http://msdn.microsoft.com/pl-pl/library/bb534644.aspx) или [IEnumerable.Join] (http: // msdn .microsoft.com/pl-pl/library/system.linq.enumerable.join.aspx), или - при использовании EF - использовать свойства навигации. :) –

+0

Извините, я даже не думал, что это должна быть проблема. Я использую ADO.NET EX-Code First. – Leron

+0

Я просто уточняю, LINQ To SQL является * старше *, в то время как Entity Framework (с использованием LINQ To Entities) является чуть более новым, хотя оба работают немного по-другому. –

ответ

1

После последнего комментария я думаю, что это то, что вы ищете:

from s in SoleService.All() 
join sc in SoleColorService.All() on s.ID equals sc.SoleID 
select s 

Но это работает только, если оба хранилищ имеют один и тот же экземпляр контекста. Если нет, то вы должны сделать это в два этапа:

var ids = SoleColorService.All().Select(sc => sc.SoleID).ToArray(); 
var soles = SoleService.All().Where(s => ids.Contains(s.ID)); 

Я немного подозрительным, хотя о статических All() методов. Они предлагают использовать статические контексты, которые считаются плохой практикой. Далее я задаюсь вопросом об ассоциациях. Звуком слов, которые я ожидал бы Sole, было бы SoleColor, т. Е. Sole иметь SoleColorId FK.

+0

Я получаю сообщение об ошибке - 'Значение не может быть пустым '- хотя я не вижу, что точно принимает нулевое значение. Однако я попробовал оба примера. – Leron

+0

Является ли какой-либо из этих 'SoleId' допустимыми? –

+0

Нет, я думал, что это будет тип 'long' not' long? ', И в базе данных он помечен как' NOT NULL' – Leron