Как вы можете динамически получать все записи определенного подтипа с помощью Linq to Entities? - PullRequest
4 голосов
/ 26 июля 2010

Я пытаюсь получить список всех объектов в базе данных указанного типа. Я делал это раньше, когда тип был известен во время компиляции, но теперь я пытаюсь передать тип в метод и заставить метод вернуть все записи указанного типа, и я не могу заставить его работать. Я пробовал следующее:

    public IList<WritingObject> GetBasicObjectsByProject(int projectId, Type oType)
    {
        var results = from o in _objects.AsQueryable
                      where o.Project.Id == projectId
                      && o.GetType() == oType
                      select o;

        return results.ToList<WritingObject>();
    }

Это не сработало, потому что Linq to Entities не поддерживает метод GetType (). Далее я попробовал

        var results = from o in _objects.AsQueryable
                      where o.Project.Id == projectId
                      && o is oType
                      select o;

Это не работает, потому что компилятор утверждает, что oType не относится к известному типу. Использование typeof(oType) приводит к той же ошибке, что и выполнение OfType<oType>() на IQueryable.

У меня заканчиваются идеи сохранить эту динамику, не разбивая ее на один метод для подтипа. У кого-нибудь есть идеи?

Ответы [ 2 ]

1 голос
/ 26 июля 2010

Что-то вроде:?

var query = from o in _objects.AsQueryable()
            where o.Project.Id == projectId
            select o;

var ofType = typeof (Queryable).GetMethod("OfType").MakeGenericMethod(oType);
var list = (IQueryable)ofType.Invoke(
            null, new object[] {query}).Cast<WritingObject>().ToList();

Обратите внимание, что это будет включать и другие подтипы.

0 голосов
/ 26 июля 2010

Я думаю, что проблема здесь в том, что Linq-to-Entities пытается перевести o.GetType в SQL, что, очевидно, не может.Перечитав вопрос, я понял, что это связано с linq для сущностей, которые не могут отобразить тип CLR в тип базы данных. Помощь Linq to Entities говорит об этом:

Стандартные операторы запросов LINQ, которые имеют дело с преобразованием типов CLR и тестированием, поддерживаются в Entity Framework.Только типы CLR, которые соответствуют концептуальным типам моделей, поддерживаются в LINQ to Entities.Список типов концептуальных моделей см. В Типах концептуальных моделей .

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

Решение этой проблемы может быть неэффективным - вам потребуется запросить все записи, соответствующиеprojectId критериев, а затем отфильтруйте их по типу:

    var results = (from o in _objects.AsQueryable
                  where o.Project.Id == projectId
                  select o).ToList(); //force query execution here

    results = from o in results 
              where o.GetType() == oType
              select o;

    return results.ToList<WritingObject>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...