虽然功能有点强大,但System.Linq.Dynamic库却缺少文档,特别是在更复杂的查询必须遵循的约定方面。
在我正在处理的查询中,它包含FirstOrDefault
调用,但我似乎无法让它工作。
这是整个(非工作)表达式:
"Locations.FirstOrDefault(x => x.IsPrimaryLocation).Address1 as Address"
我可以编写FirstOrDefault表达式来使用Dynamic linq吗?
写这个表达式的正确方法是什么?
答案 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;
}
}