2013-05-19 3 views
0

Я пытаюсь использовать generics для загрузки записи в свой кеш dbcontext. Я использую следующий код.C# Entity Framework 5.0 Generic LINQ

_Context.Set<T>().Where(R => (int)R.GetType().GetProperty("Id").GetValue(R) == id).Load(); 

Этот код вызывает следующую ошибку, и я не могу понять, как обойти его.

System.NotSupportedException: LINQ to Entities не распознает метод 'System.Object GetValue (System.Object)', и этот метод не может быть переведен в выражение хранилища.

Является ли это возможным или существует другой способ.

+0

Это, вероятно, будет работать, если у вас есть базовый тип сущности и добавьте черту 'where T: BaseEntity'. Тогда вы можете просто использовать 'R.ID'. –

+0

Unforuntaley Мне нужно использовать, где T: класс для доступа к dbset в общем –

+0

Я нашел, что мог бы использовать следующий код и, кажется, добавить запись в локальный кеш, не уверен, что это правильный способ сделать это. _Context.Set () .Find (id); –

ответ

4

Проблема заключается в том, что вы пытаетесь использовать методы Reflection (GetType(), GetProperty(), GetValue()) с LINQ to Entities и не понимаете их. Методы, которые вы разрешаете использовать внутри запроса LINQ, ограничены тем, что поддерживает поставщик запросов, а в случае LINQ to Entities - это в основном вещи, которые можно легко перевести на SQL.

Вы, к сожалению, не сможете найти подходящий идентификатор. Использование .Find(id) будет работать до тех пор, пока первичный ключ для типа сущности, заданный T, имеет один столбец, а id - правильный тип, но это будет очень хрупкий подход, даже если он работает в некоторых случаях.

Если вы описали свой сценарий немного больше, у людей могут быть хорошие предложения по другому подходу. Можете ли вы объяснить, почему вы хотите сделать это в целом? Весьма необычно, что вы хотите выполнить запрос против своего DbContext, не зная, какой тип объекта вам интересен.

+0

* до тех пор, пока первичный ключ для типа сущности, указанного T, имеет один столбец * Не верно: http://msdn.microsoft.com/en-us/library/gg696418(v=vs.103).aspx Но исправьте, что это хрупкий подход. –

+0

@ ta.speot.is Я имел в виду, что если вы только передаете 'Find()' одно значение (как в своем примере), то первичный ключ также должен содержать один столбец. Если вы попытаетесь выполнить 'Find (id)', и тип сущности имеет составной первичный ключ, это будет barf. –

+0

@Jeremy Todd, отметил это как ответ, потому что он отвечает на мой вопрос, но я не нашел лучшего подхода к функции Найти. Я не понимаю концепцию базового объекта –

Смежные вопросы