解决方案 »
- 从数据库取出的信息(如通知公告等)在网页对话框如何适当的显示?
- FileUpload.HasFile属性永远为"false"
- 讨论关于判断邮箱是否真实的问题,希望大家积极参与!!!!!!
- 100分求:实现iGoogle中可以移动的内容。用C#语言实现的源码~~~~急!!!!
- .net下实现可以拖动节点的树形菜单
- C#如何给客户端注册教本
- web安装程序怎么把数据库部署到数据服务器上而不是web安装的服务器上??
- 请问如何在页面中备份数据库?请给出详细的例子
- nginx asp.net request 难处理,求高人指点
- 关于page_load的问题 ???在线等ing……
- An error occurred while starting a transaction on the provider connection
- 大数据量,在线生成excel的解决方案
2.看实际需求可返回IEnumerable<model> IEnumerable<dynamic> IEnumerable<object[]> model dynamic object[]等
我的观点与你一致。但是在使用EF的过程中我发现,若封装在service中的某方法,在被UI调用时只需要用到实体E的A属性和B属性,那我当然希望封装时只返回A属性和B属性的值,方法内部可以用匿名对象直接实现。但该方法的返回值,就存在问题了呀,难道单独为该方法新建一个模型吗?可若不新建模型,又无法指定方法的返回值。
不使用EF的情况下,一切都很明朗。我的问题关键是,EF下嘛。你说的第二点,其中返回动态类型的,我觉得不太好吧,性能降低,以及抛开了ORM本身的优势。
你也不要太绝对了。比如说微信团队发布了api,难道调用其api的人都不能用于自己创意的业务、而只能按照微信团队示例的那1、2种程序去设计了?“封装”是个博弈的过程,不是教条。
但问题在于,我是在做“原来4个查询”这部分,并不是“使用微信API再写业务”的情况。
我若是只负责写service,当然是提供“我认为足够的返回格式”,同时为了应付可能多变的需求,我将“IQueryable查询计算器”也提供给调用方。我会认为一般情况下,service中已有指定返回格式的方法,已经足够调用方使用。若实在不满足,还有查询计算器可供使用。
在以上前提下,作为调用方,若出现“现有返回格式不满足业务需求”,service又没时间给我提供新的方法,我当然会直接用查询计算器自己写业务啦(业务虽然暴露)。我想问的是第一部分,跟第二部分没关系嘛。你这里说到“一个新的model”,那是不是指,我确实应该按需创建新model当返回值?
再次感谢大神~
一个查询服务应该是提供一种类型的查询,而不是指定具体的哪个表哪个字段,
它可以满足所有这种类型的查询需求;
这就好比你的一个View描述的是一种类型的外观逻辑,
它可以满足所有这种交互模式的界面,而不是特定的某一个界面sql能做到,ado.net也能做到,EF难道会做不到按需输出?
但是ADO.NET返回一个datatable,里面的字段要手动去接收,dt.rows[0]["UserName"],这样显然也可以,但是运行时如果结果集里没有这个字段,会在运行时出异常。而且如果你不告诉调用者我的datatable里有这个字段,他也不会知道,或者他只能通过调试去了解这个datatable中都有哪些字段。不知道我说的这些是否有一点正确
这个道理谁都懂,我并不是在技术上说这个问题。如果选择了EF,那么先要去理解他的设计思想,然后再去运用,不要纠结于一些小细节。
从OOAD的角度说,DataTable也是View(确切地说是数据视图),
所以在MVC模式下,也是由控制器负责View和DataView之间的渲染和更新的,
开发人员不需要知道UserName这样具体的信息,
//比如:要把DataRow中的数据绑定到界面的录入表单,可以这样:
UpdateView(this.Page, pDR, this.BusinessModel.MethodSave);
从OOAD的角度说,DataTable也是View(确切地说是数据视图),
所以在MVC模式下,也是由控制器负责View和DataView之间的渲染和更新的,
开发人员不需要知道UserName这样具体的信息,
//比如:要把DataRow中的数据绑定到界面的录入表单,可以这样:
UpdateView(this.Page, pDR, this.BusinessModel.MethodSave);
再次重申,我说的是两个东西是完全不同的设计思想,不要拿技术套好嘛
如果要加字段返回Model 没有找好的办法
就是重构领域模型 而不是直接使用数据表模型
不使用EF的情况下,一切都很明朗。我的问题关键是,EF下嘛。你说的第二点,其中返回动态类型的,我觉得不太好吧,性能降低,以及抛开了ORM本身的优势。
dynamic性能降低这个还真没去想过,不过看你的回复后特意做了个小测试。代码: int times = int.Parse(textBox1.Text); Stopwatch watch1 = Stopwatch.StartNew();
IList<Test> list = new List<Test>();
Test test = null;
for (int i = 0; i < times; i++)
{
test = new Test();
test.Search = i;
test.Search1 = i;
test.Search2 = i;
test.Search3 = i;
test.Search4 = i;
test.Search5 = i;
test.Search6 = i;
list.Add(test);
}
JsonHelper.JsonSerializer(list);
label1.Text = (string.Format("使用JsonConvert.SerializeObject执行" + times + "次:反射实体类耗时:{0} 毫秒", watch1.ElapsedMilliseconds)); Stopwatch watch2 = Stopwatch.StartNew();
IList<dynamic> list2 = new List<dynamic>();
for (int i = 0; i < times; i++)
{
list2.Add(new {
Search = i,
Search1 = i,
Search2 = i,
Search3 = i,
Search4 = i,
Search5 = i,
Search6 = i
});
}
JsonHelper.JsonSerializer(list2);
label2.Text = (string.Format("使用JsonConvert.SerializeObject执行" + times + "次:dynamic耗时:{0} 毫秒", watch2.ElapsedMilliseconds));
对于纯数据服务,需要定义数据成员集合,可以参考fastCSharp的MemberMap<T>。