(精华)2020年7月23日 C#基础知识点 表达式目录数实现组合继承(EF动态查询)
发布日期:2021-06-29 15:08:16 浏览次数:3 分类:技术文章

本文共 2683 字,大约阅读时间需要 8 分钟。

//定义数据模型类public class Base_UserTestDTO : Base_User{
public string DepartmentName {
get; set; }}//即BaseBusiness中的Servicevar db = DbFactory.GetRepository();Expression
> select = (a, b) => new Base_UserTestDTO{
DepartmentName = b.Name};select = select.BuildExtendSelectExpre();var q = from a in db.GetIQueryable
().AsExpandable() join b in db.GetIQueryable
() on a.DepartmentId equals b.Id into ab from b in ab.DefaultIfEmpty() select @select.Invoke(a, b);//筛选var where = LinqHelper.True
();where = where.And(x => x.UserName == "Admin");//获取筛选数据var list = q.Where(where).ToList();
public static Expression
> BuildExtendSelectExpre
(this Expression
> expression){
return GetExtendSelectExpre
>(expression);}
private static Expression
GetExtendSelectExpre
(Expression
expression){
NewExpression newBody = Expression.New(typeof(TResult)); MemberInitExpression oldExpression = (MemberInitExpression)expression.Body; ParameterExpression[] oldParamters = expression.Parameters.ToArray(); List
existsProperties = new List
(); oldExpression.Bindings.ToList().ForEach(aBinding => {
existsProperties.Add(aBinding.Member.Name); }); List
newBindings = new List
(); typeof(TBase).GetProperties().Where(x => !existsProperties.Contains(x.Name)).ToList().ForEach(aProperty => { if (typeof(TResult).GetMembers().Any(x => x.Name == aProperty.Name)) { MemberBinding newMemberBinding = null; var valueExpre = Expression.Property(oldParamters[0], aProperty.Name); if (typeof(TBase).IsAssignableFrom(typeof(TResult))) { newMemberBinding = Expression.Bind(aProperty, valueExpre); } else { newMemberBinding = Expression.Bind(typeof(TResult).GetProperty(aProperty.Name), valueExpre); } newBindings.Add(newMemberBinding); } }); newBindings.AddRange(oldExpression.Bindings); var body = Expression.MemberInit(newBody, newBindings.ToArray()); var resExpression = Expression.Lambda
(body, oldParamters); return resExpression;}
///     /// Linq操作帮助类    ///     public static class LinqHelper    {
/// /// 创建初始条件为True的表达式 /// ///
///
public static Expression
> True
() {
return x => true; } ///
/// 创建初始条件为False的表达式 /// ///
///
public static Expression
> False
() { return x => false; } }

转载地址:https://codeboy.blog.csdn.net/article/details/107539166 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:(精华)2020年7月26日 React html中使用react
下一篇:(精华)2020年7月22日 ASP.NET Core Worker Service构建系统服务实现任务调度

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月23日 13时45分01秒