echarts的数据模型生成 C# 用户组织架构图

用户上下级关系、层级关系全部循环到一个Model里面去

public class UserController : ApiController
    {
        DAL.EF db = new DAL.EF();
        
        //上级结果只有一个 tree[0],用一个tree[0]存储当前用户以及所有下级的关系
        List<Models.User> tree = new List<Models.User>();

        //用一个V存储所有下级的echarts模型
        V_model V = new V_model();

        public string GetTreeJson(int id)
        {
            var list = db.User_Repository.dbSet.SqlQuery(@"WITH TREE AS(SELECT * FROM [User] WHERE userid = " + id + " UNION ALL SELECT [User].* FROM [User], TREE WHERE [User].ParentID = TREE.userid )SELECT* FROM TREE ").ToList();
            if (list.Count == 0)
            {
                return "";
            }
            //初始值
            var first = list[0];
            V.name = first.TrueName;
            V.value = first.UserNo;
            V.children = new List<V_model>();
            tree.Add(first);

            //开始递归
            AddSub(list,first,V);
            //递归完成
            return JsonConvert.SerializeObject(V) ;//输出echart 数据对象
            //return JsonConvert.SerializeObject(list) ;//输出Models.User对象
        }
        public void AddSub(List<Models.User> all, Models.User curUser,V_model vModel)
        {
            List<Models.User> sublist = all.Where(a => a.ParentID == curUser.UserID).ToList(); //得到子节点
            curUser.SubUsers = sublist;
            foreach (var subItem in sublist)
            {
                var vv = new V_model {
                    name = subItem.TrueName,
                    value = subItem.UserNo,
                    children = new List<V_model>()
                     };
                vModel.children.Add(vv);
                AddSub(all, subItem,vv);
            }
        }
    }
//Echarts数据对象模型
    public class V_model
    {
        public string name { get; set; }
        public string value { get; set; }
        public List<V_model> children { get; set; }
    }
public partial class User
    {
        [Key]
        public int UserID { get; set; }
        ......
        public int ParentID{get;set;}
        [NotMapped]
        public virtual List<Models.User> SubUsers { get; set; }
    }

 

html向后台传参的几个注意事项

 <input type="checkbox" name="b" />
 <input type="checkbox" name="a" value="1"/>
 <input type="checkbox" name="a"  value="2"/>

1、MVC的Action参数如 Add(string a),如果页面选择了复选框,那么此时a的值是1,只能获取第一个值
2、如果没有选择任何复选框,则a的值为null,此时获取需要Add(string[] a)来获取,获取之后需要判断是否为null
3、Request.Form[“a”] 如果选择了复选框,那么此时Request.Form[“a”]值是1或者1,2或者2,如果没选复选框则值是null
4、

<input type="text" value="" name="a"> input type="text" value="" name="a"> 

文本框,不管填没填内容都不会是null,如果全为空,则Request.Form[“a”]和mvc的string [] a 的结果都是 空字符,空字符

类型同时存在于XX

一般情况下出现这种问题是有两个重名的对象比如
using model;
using models;
var a=new b{}
model命名空间下面包含类b,models命名空间下也包含类b,导致程序不知道到底要实例化哪个命名空间下的b,导致此错误的发生。

我的web项目引用了model项目,之后我将model改名为models,清理了解决方案之后发现依然报错,最后发现web的bin目录下清理解决方案的时候仍然存在model.dll,删掉解决。

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded

程序报错,Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded,一般两种情况
第一、主键不存在
第二、在载入后模型被修改或者删除
我的问题恰好属于第一种,调试后发现Mode.ID为0,原因如下

@Html.HiddenFor(model => model.ID)没有写在Form里,服务器接收到的ID是空值,由于是int类型,自动转换为0

Lamda表达式的拼接

一、方法1
首先拼接类(别管为什么,复制就行…)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace FF
{
    //用户lambda表达式的拼接
    public static class PredicateBuilder
    {

        public static Expression<Func<T, bool>> True<T>() { return f => true; }
        public static Expression<Func<T, bool>> False<T>() { return f => false; }
        public static Expression<T> Compose<T>(this Expression<T> first, Expression<T> second, Func<Expression, Expression, Expression> merge)
        {
            // build parameter map (from parameters of second to parameters of first)  
            var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);

            // replace parameters in the second lambda expression with parameters from the first  
            var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);

            // apply composition of lambda expression bodies to parameters from the first expression   
            return Expression.Lambda<T>(merge(first.Body, secondBody), first.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
        {
            return first.Compose(second, Expression.And);
        }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> first, Expression<Func<T, bool>> second)
        {
            return first.Compose(second, Expression.Or);
        }
    }
    public class ParameterRebinder : ExpressionVisitor
    {
        private readonly Dictionary<ParameterExpression, ParameterExpression> map;

        public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
        {
            this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
        }

        public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)
        {
            return new ParameterRebinder(map).Visit(exp);
        }

        protected override Expression VisitParameter(ParameterExpression p)
        {
            ParameterExpression replacement;
            if (map.TryGetValue(p, out replacement))
            {
                p = replacement;
            }
            return base.VisitParameter(p);
        }
    }
}

引用 方法

var predicate = FF.PredicateBuilder.True();
//和操作
var predicate = predicate.And(a => a.DeviceID == deviceid);
//或操作
predicate = predicate.Or(a => a.DeviceID == deviceid);

//将predicate 放入条件
var list = db.dbSet.Where(predicate);
//另外记得引用命名空间 这里是 FF
using FF;

二、方法2
增加一个Expression扩展类

public static class ExpressionExt
{
    public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
    {          
        return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, expr2.Body), expr1.Parameters);
    }
    public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,Expression<Func<T, bool>> expr2)
    {
        return Expression.Lambda<Func<T, bool>>(Expression.OrElse(expr1.Body, expr2.Body), expr1.Parameters);
    }
}

使用方法:

Expression<Func<Models.Content, bool>> exp= s => s.IsDel==false;
            exp = exp.And(s => s.IsHot == true);

Razor的一些写法记录

Razor foreach获取索引方法

@{int i = 0;}
                @foreach (DataRow dr in ((DataTable)ViewData["set"]).Rows)
                {
                    i++;
                        <tr>
                            <td>@i</td>
                            <td>@dr["UserName"]</td>
                            <td>@dr["MPhone"]</td>
                        </tr>
                }

Razor与字符串组合

@foreach (var rd in item.User)
{
  <li>
       <input type="radio" value="@rd.UserName" id="rid@(rd.UserID)" name="radiogroup" />
       <label for="rid@(rd.UserID)">@rd.UserName</label>
  </li>
}

Razor 三元表达式

<div @Html.Raw(i==1?"class='active'":"")>@item.JDName</div>
//否则输出为 class=&39;active&39;