Можно ли сделать Dynamic LINQ совместимым с комплексными типами объектов? - PullRequest
1 голос
/ 21 марта 2012

Я хочу динамически запрашивать объект с помощью System.Linq.Dynamic.

 var selectData = (from i in data 
                      select i).AsQueryable().Where("Name = @0","Bob1");//This works fine with a non-entity object

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

        foreach (var item in rawQuery.ObsDataResultList)
        {
            var propertyData = (from i in item
                                select i).AsQueryable().Where("PropertyName = @0", "blah");
        }//item is a Entity Complex Type

Error

Не удалось найти реализацию шаблона запроса для тип источника "ClassLibrary1.Model.bhcs_ObsData_2_Result". «Выбрать» не найдено.

Учитывая тот факт, что мне нужно указать PropertyName во время выполнения, я не вижу способа проецирования с анонимным типом или DTO.

На данный момент мне не нужно сохранять какие-либо функциональные возможности сущности, мне просто нужны данные. Копирование данных на что-то запрашиваемое является допустимым решением. Итак, возможно ли запросить структуру сущностей с помощью динамического LINQ?

А вот заголовок класса сущности (вещь, которую я пытаюсь запросить, или объект item)

[EdmComplexTypeAttribute(NamespaceName="MyDbModel", Name="blah_myQuery_2_Result")]
[DataContractAttribute(IsReference=true)]
[Serializable()]
public partial class blah_myQuery_2_Result : ComplexObject
{

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Прежде всего, позвольте мне уточнить, что System.Linq.Dynamic не является полноценным продуктом Microsoft.Это всего лишь пример, который мы выпустили некоторое время назад, и мы не проводим тщательного тестирования различных реализаций LINQ для правильной работы с ним.Если вы ищете полностью поддерживаемый текстовый язык запросов для EF ObjectContext API, вы должны вместо этого взглянуть на Entity SQL.

Кроме того, если вы хотите использовать System.Linq.Dynamic и у вас все в порядкепроверив себя, что вы не нажмете ничего, что заблокирует работу вашего приложения, я постараюсь выяснить, смогу ли я помочь.Мне понадобится дополнительная информация, так как я не уверен, что все понимаю в ваших фрагментах кода.

Прежде всего, я хотел бы понять, в вашем первом примере, что такое «данные» и откуда они берутся?В вашем втором фрагменте, что такое «rawQuery» и откуда он взялся?Besdies, что такое rawQuery.DataResultList и что такое rawQuery.ObsDataResultList?

Кроме того, что касается вашего второго фрагмента, кажется, что вы пытаетесь создать операторы запроса поверх объекта, который на самом деле не относится к типу запроса(хотя это не объясняет ошибку, которую вы получаете, учитывая, что вы вызываете AsQueryable, компилятор должен был жаловаться до того, что bhcs_ObsData_2_Result не является IEnumerable или не универсальным IEnumerable).

В своем предполагаемом ответе вы говорите, что пытались использовать ObjectResult, и это, похоже, помогло.Просто имейте в виду, что ObjectResult не является объектом запроса, и поэтому он не позволит вам создавать запросы, которые отправляются на сервер.Другими словами, любые операторы запросов, которые вы применяете к ObjectResult, будут оцениваться в памяти, и если вы не будете помнить об этом, вы можете в конечном итоге перенести все данные из этой таблицы в память, прежде чем применять какую-либо фильтрацию.

0 голосов
/ 22 марта 2012

Запрос ObjectResult<blah_myQuery_2_Result> напрямую вместо элемента blah_myQuery_2_Result.Например

var result = (from i in rawQuery.DataResultList
                          select i).AsQueryable().Where("CreatedDTM > @0", DateTime.Now.Subtract(new TimeSpan(30, 0, 0, 0)));
...