Можно ли сделать Dynamic LINQ совместимым со сложными типами сущностей?

Я хочу динамически запрашивать объект с 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

Ошибка

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

 var selectData = (from i in data 
                      select i).AsQueryable().Where("Name = @0","Bob1");//This works fine with a non-entity object
Result". «Выбрать» не найдено.

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

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

И вот заголовок класса сущности (то, что я пытаюсь запросить, также известный как объект элемента)

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

person P.Brian.Mackey    schedule 21.03.2012    source источник
comment
Я с интересом слежу за этим, так как еще мало что узнал о динамическом linq. Но я должен сказать (чисто субъективно, с точки зрения стиля), что мне сложно смешивать понимание запросов с вызовами методов в одном и том же выражении, особенно если понимание запроса является тривиальным from i in data select i. Я думаю, вы найдете код более удобным в обслуживании, если измените (from i in data select i).AsQueryable() на data.AsQueryable().   -  person phoog    schedule 22.03.2012


Ответы (2)


Прежде всего, позвольте мне уточнить, что 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, будут оцениваться в памяти, и если вы не будете об этом помнить, вы можете в конечном итоге перенести все данные из этой таблицы в память, прежде чем применять какую-либо фильтрацию.

person divega    schedule 26.03.2012
comment
data представляет собой запрос на фиктивный объект. rawQuery - это экземпляр объекта пользовательского класса. В классе 4 члена типа List<ComplexObject> (DataResultList, ObsDataResultList). Это произошло из-за операции чтения в DL. DL запрашивает набор хранимых процедур на основе некоторых параметров. Параметры выполняют фильтрацию перед примером кода. Итак, я не беспокоюсь о загрузке в память полной таблицы, в данном случае об отложенном выполнении. Хотя в целом это хороший момент. - person P.Brian.Mackey; 18.04.2012

Запрашивайте ObjectResult<blah_myQueryblah_myQuery_2_ResultResult> напрямую вместо элемента 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)));
person P.Brian.Mackey    schedule 21.03.2012