2014-12-12 2 views
0

Мне дана база данных. В этой базе данных является таблица с именем Пример, который выглядит следующим образом:Присоединиться к таблице со строковым значением в Linq

ID EntityName EntityID 
1  Foo   1 
2  Bar   1 
3  Foo   2 
4  Bar   2 

Колонка EntityName и EntityId объединяются, чтобы сделать внешний ключ либо Foo или таблицы Bar. Если поле EntityName имеет значение «Foo», EntityID ссылается на FooID в таблице Foo. К сожалению, структура базы данных не должна изменяться. Мой вопрос:

Могу ли я создать запрос Linq, который только присоединяется к необходимой таблице на основе значения EntityName?

Я ищу что-то вроде этого:

from e in examples 
join table in [e.EntityName] ON e.EntityID equals table.([EntityID] + "ID") 
// etc 

это может быть сделано?

+2

Что вы ожидаете от SQL? –

+0

Я бы добавил подзапрос, который получает значение столбца EntityName, а затем if/else, чтобы решить, к какой таблице присоединяется. Не очень красивое решение, но оно может работать. На боковой панели вы очень хорошо ответили на один из моих предыдущих вопросов. В результате я начал читать твою книгу в надежде на то, чтобы пробиться к твоему уровню. Спасибо за продолжение помощи! – ohyeah

+0

Этот подзапрос может выглядеть довольно интересным ... Я подозреваю, что вам вполне может понадобиться эффективно выполнить трехстороннее соединение с некоторыми фиктивными значениями. Я могу представить, что может выглядеть LINQ *, но я не знаю, действительно ли это работает ... –

ответ

0

Ключ - это количество значений Name.

Поскольку у вас есть 2 вы используете союз ... как это:

var result = 
(from e in examples 
where e.EntityName == "Foo" 
join foos in foo ON e.EntityID equals foo.fooID 
) 

.Union 

(from e in examples 
where e.EntityName == "Bar" 
join bars in bar ON e.EntityID equals bar.barID 
); 

Похоже, есть «лишние» здесь и это будет медленнее, но это должно привести к Effient заявления SQL с помощью UNION ALL

+0

LINQ не позволит вам использовать типы соединений, которые не совпадают. Я бы предположил, что Foo и Bar имеют разные типы в OP. Возможно, если бы они разделили общий базовый класс, можно было бы использовать union. [link] (http://msdn.microsoft.com/en-us/library/vstudio/bb341731 (v = vs.110) .aspx) –

+0

@BradD плохое предположение. В каждом случае такой модели данных я видел, что они в основном одинаковы или могут быть «отлиты» или выбраны подмножество, которые являются одинаковыми. ОП не дал нам знать эти детали, поэтому мы должны предположить, что его вопрос разрешим. – Hogan

+0

Не лучше или хуже, чем предположение, что их можно отличить. Возможно, разъяснение от ОП в порядке. –