当前位置:编程学习 > C#/ASP.NET >>

关于实体字段取舍的疑惑

如图, 我现在需要设计一个实体, 开放给API和服务接口供调用方调用. 其包含的信息需要供不同的调用方调用. 而且基本上每次都要传输大量的这种东西给不同的调用方(主要是手机端和网站). 所以调用方要求精简字段, 以提高查询效率. 只传输他们有必要使用的字段. 其他字段不能出现在传输体上. 传输形式都一样, XML、JSON等等这不重要, 重要的是在这种情况下我不可能为每一个调用方都单独写一个实体, 一个调用的方法吧? 难道以后增加调用方我还需要再给他建立一个实体? 所以想请教一下各位, 在你们遇到这种事情的时候应该怎么处理? 我该如何设计这个实体以满足不同调用方的需求?

需求 JSON 移动端开发 设计 --------------------编程问答-------------------- 可以用Linq,需要哪些字段就返回哪些字段,类似于sql的思想。 --------------------编程问答-------------------- 那就不能以实体返回了,不知你用的什么框架WebAPI、WCF还是其他什么的,应该都有自己的解决方案,根据所传字段按需返回,起码WebAPI是可以实现的! --------------------编程问答--------------------
引用 2 楼 fangxuan 的回复:
那就不能以实体返回了,不知你用的什么框架WebAPI、WCF还是其他什么的,应该都有自己的解决方案,根据所传字段按需返回,起码WebAPI是可以实现的!


WebAPI 和 WCF 皆有. 网上搜了一下, 似乎没有谁提到过 "按需返回字段" 这个概念?? 可否详细说一下呢? --------------------编程问答--------------------
引用 1 楼 guwei4037 的回复:
可以用Linq,需要哪些字段就返回哪些字段,类似于sql的思想。


Linq? 怎么处理? 我们后台数据层用的是类似于 IBatis 这种的ORM框架, 不是 Entity Framework.
其实我是想如果他不需要这个字段, 我在SQL中压根就不会查询这个字段. 这样查询效率还可以进一步提高.
而且这些字段往往不是从DB出来的, 而是MemoryCache.... --------------------编程问答-------------------- 你应该有自己的接口规范,可以用字符串参数。
或者用动态参数。

字符串参数请求:
GetUser("ID,UserName");
只返回ID,UserName数据即可。 --------------------编程问答--------------------
引用 5 楼 banian_cn 的回复:
你应该有自己的接口规范,可以用字符串参数。
或者用动态参数。

字符串参数请求:
GetUser("ID,UserName");
只返回ID,UserName数据即可。


然后呢? --------------------编程问答--------------------
引用 3 楼 lujiaxing2007 的回复:
Quote: 引用 2 楼 fangxuan 的回复:

那就不能以实体返回了,不知你用的什么框架WebAPI、WCF还是其他什么的,应该都有自己的解决方案,根据所传字段按需返回,起码WebAPI是可以实现的!


WebAPI 和 WCF 皆有. 网上搜了一下, 似乎没有谁提到过 "按需返回字段" 这个概念?? 可否详细说一下呢?


根据你的要求,大致可封装方法如下:
假定传入的字段为以英文逗号分割的字符串,返回内容以字典为例,model为你定义的相关实体对象
public static Dictionary<string, object> StringFields<T>(T model, string fields) where T : class
{
    Dictionary<string, object> dic = new Dictionary<string, object>();
    if (model != null)
    {                
        string[] arrFields = { };
        if (!string.IsNullOrEmpty(fields))
        {
            arrFields = fields.Replace(",", ",").Split(',');
        }
        var strArr = model.GetType().GetProperties();                
        if (arrFields.Length > 0)
        {
            foreach (var s in arrFields)
            {                       
                var _model = strArr.Where(item => item.Name.ToLower() == s.ToLower()).FirstOrDefault();
                if (_model != null)
                {
                    dic.Add(_model.Name, _model.GetValue(model, null) == null ? string.Empty : _model.GetValue(model, null));
                }
            }
        }
        else
        {
          
            strArr.All(o => { dic.Add(o.Name, o.GetValue(model, null)); return true; });
        }
    }
    return dic;
}
楼主可试试类推之… --------------------编程问答--------------------
引用 6 楼 lujiaxing2007 的回复:
然后呢?

然后你根据传入的字段 给相应的实体字段赋值返回就行了。 --------------------编程问答--------------------
引用 7 楼 fangxuan 的回复:
Quote: 引用 3 楼 lujiaxing2007 的回复:

Quote: 引用 2 楼 fangxuan 的回复:

那就不能以实体返回了,不知你用的什么框架WebAPI、WCF还是其他什么的,应该都有自己的解决方案,根据所传字段按需返回,起码WebAPI是可以实现的!


WebAPI 和 WCF 皆有. 网上搜了一下, 似乎没有谁提到过 "按需返回字段" 这个概念?? 可否详细说一下呢?


根据你的要求,大致可封装方法如下:
假定传入的字段为以英文逗号分割的字符串,返回内容以字典为例,model为你定义的相关实体对象
public static Dictionary<string, object> StringFields<T>(T model, string fields) where T : class
{
    Dictionary<string, object> dic = new Dictionary<string, object>();
    if (model != null)
    {                
        string[] arrFields = { };
        if (!string.IsNullOrEmpty(fields))
        {
            arrFields = fields.Replace(",", ",").Split(',');
        }
        var strArr = model.GetType().GetProperties();                
        if (arrFields.Length > 0)
        {
            foreach (var s in arrFields)
            {                       
                var _model = strArr.Where(item => item.Name.ToLower() == s.ToLower()).FirstOrDefault();
                if (_model != null)
                {
                    dic.Add(_model.Name, _model.GetValue(model, null) == null ? string.Empty : _model.GetValue(model, null));
                }
            }
        }
        else
        {
          
            strArr.All(o => { dic.Add(o.Name, o.GetValue(model, null)); return true; });
        }
    }
    return dic;
}
楼主可试试类推之…

补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,