如何在Dynamic Linq表达式中使用带有Func参数的linq扩展?

时间:2014-10-06 14:17:29

标签: linq extension-methods dynamic-linq

虽然功能有点强大,但System.Linq.Dynamic库却缺少文档,特别是在更复杂的查询必须遵循的约定方面。

在我正在处理的查询中,它包含FirstOrDefault调用,但我似乎无法让它工作。

这是整个(非工作)表达式:

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

我可以编写FirstOrDefault表达式来使用Dynamic linq吗?

写这个表达式的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

扩展动态库当然是一个已经建议的选项。 给定动态Linq中的Where的替代方法返回一个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对象用于上下文或存储库“位置” 然后使用包含动态字符串谓词的where,并使用firstOrDefault   (不考虑捕获或测试null)

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;
    }

}