日期:2014-05-17  浏览次数:20353 次

MVC,linq,json,问题不知道怎么描述,跪求~
C# code
[HttpPost]
        public ActionResult UserJson(int? id,int? page, int? rows, string model)
        {
            int Page = page ?? 1;
            int Rows = rows ?? 10;
            QueryModel QModel = null;
            Dictionary<string, object> JsonObj = new Dictionary<string, object>();
            if (!string.IsNullOrWhiteSpace(model))
            {
                QModel = IntelligentQuery.AjaxQueryConverter.ToQueryModel(model);
            }

            if (id.HasValue)
            {
                JsonObj.Add("total", UserRepository.Get(QModel).Where(w => w.Position.OrganID == id).Count());
            }
            else
            {
                JsonObj.Add("total", UserRepository.Get(QModel).Count());
            }
            if (id.HasValue)
            {
                JsonObj.Add("rows", UserRepository.Get(QModel, orderBy: o => o.OrderBy(u => u.Position.PositionLevel)).Where(w => w.Position.OrganID == id)
                    .Skip((Page - 1) * Rows)
                    .Take(Rows)
                    .Select(s => new { s.UserNo,s.Password, s.RealName, s.Sex, s.Birthday, s.IDCardNumber, s.Height, s.IsDisabled, s.Country, s.DomicilePlace, s.IsMarried, s.PoliticsStatus, s.Education, s.GraduateSchool, s.Degree, s.DegreeBySchool, s.ResidentialAddress, s.Post, s.TelPhoneNumber, s.Email, s.QQ, s.MSN, s.JoinDate, s.PositionID, s.Position.PositionName,s.Position.Organization.OrganID, s.Position.Organization.OrganName, s.State, s.PayType, s.CheckType,s.IsSuper, s.Remark, s.IsEnable }));
            }
            else
            {
                JsonObj.Add("rows", UserRepository.Get(QModel, orderBy: o => o.OrderBy(u => u.Position.PositionLevel))
                    .Skip((Page - 1) * Rows)
                    .Take(Rows)
                    .Select(s => new { s.UserNo, s.Password, s.RealName, s.Sex, s.Birthday, s.IDCardNumber, s.Height, s.IsDisabled, s.Country, s.DomicilePlace, s.IsMarried, s.PoliticsStatus, s.Education, s.GraduateSchool, s.Degree, s.DegreeBySchool, s.ResidentialAddress, s.Post, s.TelPhoneNumber, s.Email, s.QQ, s.MSN, s.JoinDate, s.PositionID, s.Position.PositionName, s.Position.Organization.OrganID, s.Position.Organization.OrganName, s.State, s.PayType, s.CheckType, s.IsSuper, s.Remark, s.IsEnable }));
            }

            Newtonsoft.Json.Converters.IsoDateTimeConverter timeConverter = new Newtonsoft.Json.Converters.IsoDateTimeConverter();//这里使用自定义日期格式,默认是ISO8601格式         
            timeConverter.DateTimeFormat = "yyyy-MM-dd";//设置时间格式 
            string json = Newtonsoft.Json.JsonConvert.SerializeObject(JsonObj, Newtonsoft.Json.Formatting.Indented, timeConverter);//转换序列化的对象

            return Content(json, "application/json");
        }


以上方法,是用来获取前台dagagrid的数据源的。
我想问的问题有2个。

第一个问题:
User实体,有属性PositionID,与Position实体外键关联。那么,若只需要取得User实体的值,则可以把.Select()直接去掉。但是当除了需要获取User实体的所有值,还需要获取用“PositionID”关联的Position实体中的“PositionName”时,就必须在.Select()中将User的每个属性罗列一次,并且加上s.Position.PositionName吗?
这样操作起来,如果User实体属性很多,岂不是很麻烦啊,不知道有没有简便方法?

第二个问题:
User实体,有属性PayType,由于数据库设计问题,不能与基础数据表进行外键关联。也就是需要left join。可我查了一下,Lambda表达式中的group join比较麻烦,只left join一次的话,代码尚可看清楚,要是多次,那就非常不便且完全没有可读性了。我要问的是,按照上面我给出的代码来看,有什么解决方法吗?难道必须left join么。

------解决方案--------------------
第一个问题,用include