Как использовать расширения linq с параметрами Func в выражениях Dynamic Linq?

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

В запросе, над которым я работаю, он содержит вызов FirstOrDefault, но я не могу заставить его работать.

Вот полное (нерабочее) выражение:

"Locations.FirstOrDefault(x => x.IsPrimaryLocation).Address1 as Address"

Могу ли я написать это выражение FirstOrDefault для работы с Dynamic linq?

Как правильно написать это выражение?


person Mark Rogers    schedule 06.10.2014    source источник
comment
Ничего общего с динамическим linq, но FirstOrDefault() может возвращать значение null, которое вызовет исключение при попытке доступа к Address1 (или любому другому) свойству.   -  person DavidG    schedule 06.10.2014
comment
Правда, хотя моя конкретная проблема возникает до того, как она достигнет этой точки, поскольку она не может правильно проанализировать строку. Я бы принял ответ, который решил эту проблему только с помощью First() вместо FirstOrDefault().   -  person Mark Rogers    schedule 06.10.2014
comment
Это может помочь stackoverflow.com/questions/4849973 /   -  person DavidG    schedule 06.10.2014
comment
Итак, я думаю, нужно отредактировать исходный код Linq.Dynamic и добавить метод FirstOrDefault?   -  person Mark Rogers    schedule 06.10.2014
comment
Похоже на то. Не используя DL, я действительно не мог сказать.   -  person DavidG    schedule 06.10.2014
comment
Является ли динамическим все выражение или только часть внутри FirstOrDefault ?   -  person Magnus    schedule 07.10.2014
comment
Все выражение в кавычках.   -  person Mark Rogers    schedule 07.10.2014


Ответы (1)


Расширение динамической библиотеки, безусловно, является вариантом, как уже предлагалось. альтернатива, учитывая, что Where в Dynamic Linq возвращает Iqueryable

 public static class DynamicQueryable {

    public static IQueryable<T> Where<T>(this IQueryable<T> source, string predicate, params object[] values) { return (IQueryable<T>) Where((IQueryable) source, predicate, values); }

    public static IQueryable Where(this IQueryable source, string predicate, params object[] values)       {

используя DYnamic Object для контекста или «местоположений» репозитория.
Затем используйте where, который может содержать предикат динамической строки, и следуйте за ним с помощью firstOrDefault.
(захват или проверка на нуль не рассматриваются)

DynamicLocations.Where(x => x.IsPrimaryLocation).FirstOrDefault( ).Address1 as Address;

или динамический, где при необходимости

DynamicLocations.Where("IsPrimaryLocation",new string[]).FirstOrDefault( ).Address1 as Address;

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

     public virtual IQueryable<TPoco> DynamicWhere(string predicate, params object[] values) {
        return AllQ().Where(predicate, values);
    }

Пример создания экземпляра динамического универсального репозитория

  public class RepositoryFactory<TPoco>  where TPoco : BaseObject,new() {

    public IRepositoryBase<TPoco> GetRepository(DbContext context) {

       // get the Pocotype for generic repository instantiation
        var pocoTypes = new[] {typeof (TPoco)};  // but supports <T,U>
        Type repBaseType = typeof (RepositoryBase<>);

        IRepositoryBase<TPoco> repository = InstantiateRepository(context, repBaseType, pocoTypes);

        return repository;
    }


    private IRepositoryBase<TPoco> InstantiateRepository(DbContext context, Type repType, params Type[] args) {

        Type repGenericType = repType.MakeGenericType(args);
        object repInstance = Activator.CreateInstance(repGenericType, context);
        return (IRepositoryBase<TPoco>)repInstance;
    }

}
person phil soady    schedule 06.10.2014