EF中返回指定导航属性字段

在EF中无法通过select方法来指定要返回的导航属性字段值,

比如:
class Product
{
public string Name{get;set;}
public Price Price{get;set;}
}

class Price
{
public decimal Price1{get;set;}
public decimal Price2{get;set;}
}

在查询时,我们可能需要优化查询字段,只返回我们需要的某些字段,比如Price中的Price1,同时返回对应的实体而不是一个,按照需求,以下写法是最理想的实现方式了

IQueryable<Product>().Where(q=>xxx).Select(q=>new Product{q.Name,new Price{Price1=q.Price.Price1}})

 

但问题是:虽然语法上没错误,但在EF中这样写是错误的,EF中不支持这种查询方式,但是却支持

IQueryable<Product>().Where(q=>xxx).Select(q=>new {q.Name,q.Price.Price1})

 

这种查询方式

 

我们可以利用这种方式将要查询的字段按一定规则返回,并使用反射方式,将返回的值赋给实体属性。

比如:我们将导航属性q.Price.Price1改为Price_Price1,用来表示导航属性Price的Price1字段,这样我们就可以知道哪个字段对应那个属性了

IQueryable<Product>().Where(q=>xxx).Select(q=>new {q.Name,Price_Price1=q.Price.Price1})

 

按照这个规则,我们通过Price_Price1就能断定这是Price.Price1属性,只需要将Price_Price1的值赋给Price.Price1即可,同理,嵌套很深的只需要按照这个规则写下去即可

 

最终实现代码如下:

public static class SelectorExtention
{
public static IList<T> ToList<T>(this IQueryable<T> query, Expression<Func<T, object>> selector) where T : class,new()
{
IList<T> li = new List<T>();
if (selector != null)
{
var aryLi = query.Select(selector).ToList();
if (aryLi != null)
{
T tobj = default(T);
foreach (object o in aryLi)
{
tobj = CloneFieldsTo<T>(o);
li.Add(tobj);
}
}
}
else
{
li = query.ToList();
}
return li;
}

//利用反射复制查询出的字段值到实体中
private static T CloneFieldsTo<T>(object obj) where T : class,new()
{
PropertyInfo[] props = obj.GetType().GetProperties();
T tobj = Activator.CreateInstance<T>();
foreach (var p in props)
{
var tobjProp = tobj.GetType().GetProperty(p.Name);
var value = GetPropValue(obj, p.Name);
SetPropValue(tobj, p.Name, value);
}
return tobj;
}

//获取属性值
private static object GetPropValue(object obj, string pname)
{
object value = null;
PropertyInfo p = obj.GetType().GetProperty(pname);
if (p != null)
{
value = p.GetValue(obj);
}
return value;

}

//设置实体属性值

// pname 查询返回的匿名类属性名 如Price_Price1

private static void SetPropValue(object obj, string pname, object value)
{
string[] pnames = pname.Split('_');//利用“_”分割
PropertyInfo p = null;
for (int i = 0; i < pnames.Length; i++)//按照分割后的属性名依此查找对应的实体属性
{
p = obj.GetType().GetProperty(pnames[i]);
if (p != null)
{
if (pnames.Length - 1 == i)
{
p.SetValue(obj, value);
}
else
{
object pvalue = p.GetValue(obj, null);
if (pvalue == null)
{
pvalue = Activator.CreateInstance(p.PropertyType);
p.SetValue(obj, pvalue);
}
obj = pvalue;
}
}
else
{
break;
}
}
}
}

使用以上扩展

IQueryable<Product>().Where(q=>xxx).ToList(q=>new {q.Name,Price_Price1=q.Price.Price1})

 

可以直接返回Product实体及其导航属性Price下的Price1,虽然方法有些笨拙,但总算达到了我们的目的。

使用Farbox+Dropbox构建个人博客

如果您用过网盘,一定或多或少听说过Dropbox的大名,因为国内大多数网盘,如:金山快盘、百度网盘、360网盘等都是在模仿Dropbox,据说就连之前Dropbox被GFW封掉也是为了保护国内的某个网盘,可见其影响力有多大。
Dropbox是一款不可多得的数据备份同步软甲,第一次接触它是在2009年左右,当时主要使用Dropbox为工作文档备份到家中的电脑上,在当时他的同步速度超过国内绝大多数网盘,而且功能足够强大,可以删除后找回,可以根据版本号回滚,这都是当时国内网盘甚至至今现在大多数国内网盘所不具备的功能。

Dropbox不仅仅在功能方面强大,更提供了可供开发的API,而Farbox就是依此而出现在大众视野中。

Farbox是一个利用免费网络存储Dropbox(现在只支持Dropbox)构建个人站点的建站平台。

相对于其他现有的博客平台(如:百度空间)来说,你无需担心空间文章会因为因违反平台方制定的各种规则而被屏蔽或遭到删除造成数据损失,只要你的文章不违反法律法规就可以发布,只有国法没有家规;

相对于自建博客平台(如:wordpress),你可以免去每年购买主机的费用,数据库费用,数据备份费用,因为Dropbox本身就提供了完善的存储、备份及同步功能。

你甚至无需知道任何建站知识即可创建一个免费且永远属于自己的博客,如果你有一定的设计基础或编程基础,那你也可以根据Farbox给出的开发文档做出更具个人特色的博客。

我今天只向介绍一个基本功能,就是创建并发布一篇博客。
在使用Farbox之前,请确保您有一个Dropbox账号,因为Farbox是基于Dropbox的。【注册Dropbox

Image Title
Image Title
使用新注册的dropbox账号登录Farbox并授权。
Image Title
进入后台,点击左侧的设置菜单,修改网站标题及域名,默认情况下,Farbox提供一个免费的二级域名,只要域名没有被别人使用,你就可以使用,如果要使用自己注册的域名,就填上自己的注册的域名,并将域名指向park.farbox.com。
下载Dropbox客户端,安装并登录,下载Farbox客户端,选择Dropbox登录。

打开Dropbox和Farbox,Dropbox用来同步数据,Farbox用来管理博客。
我们也主要使用Farbox来管理。
Image Title
打开Farbox编辑器,按Ctrl+F可以打开文件管理窗口,这里将显示博客结构,在根目录上点右键可以使用更多功能,如新文章、绑定域名等。
一、写文章
我们发布博客就是写文章,点击写文章会新建一个文件,文件名就是博客文章名称,你可以新建多级目录来对文章分类管理,不必担心层级太复杂,Farbox会自动帮你找到所有文章。
在编辑器空白处填写相关内容,文章会通过Dropbox自动同步发布到博客中。
二、插入图片
文章中不可避免要使用到图片,最简单的方式就是复制一幅图片,直接粘贴到编辑器中,Farbox编辑器会自动将你的图片复制到系统默认的图片目录"_image"中并按日期分类,按时间命名。
如:Image Title
由于编辑器不能直接显示图片,只是显示MarkDown语法的代码:! Image Title。注意:!和[中间是没有空格的。
三、插如超链接
[链接文字] (http://链接地址),是不是很简单?
四、其它语法
标题 #标题文字 一个#表示H1,两个表示H2,以此类推

如果没有意外,根据以上方法,你已经成功发布了一篇文章了,打开浏览器,输入域名(如:http://wfk.farbox.com)即可看到您的博客了。

Farbox是一个非常智能的博客创建工具,它还会自动将你用到的图片分类生成一个相册,提供文章评论,访问统计等功能,一般情况下你不需要为这些事情操心,Farbox会自动帮你做好。

【转】真实的国情

世界共有200多个国家,其中:
1、看病掏钱的国家有20个;
2、用水晶棺材冷藏已故领导人尸体的4个,苏联,越南,朝鲜等;
3、屏蔽网络的4个,古巴,伊朗,朝鲜等;
4、有户籍制度的3个,贝宁,朝鲜等;
5、学校上政治课的2个,朝鲜等;
6、将”专政”写入宪法的2个,朝鲜等;
7、实行计划生育的1个。
上述各条全占的国家只有一个。。。。
【中国人为什么总想移民?】在德国,汽车、公司都无需年检。 问德国人:汽车不年检,坏了怎么办? 答:自己修车。 问:德国政府为何不强制年检? 德国人反问:谁给了政府这个权力?如果政府对年检感兴趣,说明这种事对它有好处。 美国人在不断的发现真理,诺贝尔物理学奖、化学奖、经济学奖、医学奖……平均每年获得两三个;中国人在不断的发明真理,毛泽东思想、***理论、三个代表、科学发展观、中国梦……平均十年发明一套。 改革就是收费,调控就是加税,听证就是涨价,特色就是继承,梦想就是移民,换地域吃米就是吃完元素周期表,处罚问题官员就是带薪休假,对外搞好关系就是掏钱,地方财政就是卖地,拉动GDP就是拆了建建了拆,圈钱就是上市,非法拘禁就是维稳,传播正能量就是叼盘,辟谣就是证实…… 最富的国家,最穷的民众;最高的权利,最低的法治;最好的江山,最差的环境;最多的行政,最少的监管;最贵的石油,最廉的劳务;最全的检查,最烂的医疗;最血的强拆,最损的征地;最长的高速,最久的收费;最奢的高铁,最贫的午餐;最缺的德行,最丧的良心。谁之罪? 郎咸平:中国有两个极端,一个是老百姓无钱可花,一个是政府富得流油;一边要百姓学雷锋,一边是官员自己搞腐败;一边百姓勤俭节约,一边是政府浪费惊人。在国外百姓是消费主体,在国内公款消费是主体,这样畸形的市场不可能持续下去!
【美美掐死红会】打蛇打七寸,干爹郭长江(郭沫若之子)骑美难下。雅安地震,红会收不到捐款,还被骂得狗血喷头,恼羞成怒之下放出狠话:要重新调查美美事件!美美立即回应:只要红会敢叫板,我立马公布红会很多不为人知的贪腐内幕和红会多位领导与我性爱视频!资料我已寄到美国,有胆你们放马过来试试。
【房租上涨房东将入狱】这是德国。5月1日起,德国新租房法生效,要求3年内房租涨幅不超15%;超20%违法;超过50%,房东被认为赚取暴利,可入狱3年。如果中国借鉴此经验管控房价,对房价年上涨10%的地方的主管官员免职,上涨20%判刑,上涨50%枪毙,估计比什么方法都有效。要不,把北京作为试点先试试?
【猴子的社保】一只猴子夏季每天可采5个坚果,吃3个就够了,而冬季经常1个都采不到。于是它入了社保,条件是夏天每天交2个坚果为越冬储备。可是到了冬天才发现每天只能领到1个,依然吃不饱。而那些夏天不用交坚果的猴群管理者,每天却能吃到3个坚果。管理者鼓励猴子:你多采几年或者加入管理队伍吧! 国人最大的敌人并不是日本,也不是美国,而是戴着假面具,穿着洋西装,裹着糖衣炮弹的118万裸官和一群脑残办的猫粪。这些人“赤条条来回无牵挂”,在国内当官能捞就捞,能贪就贪,一看风头不对,就脚底下抹油溜之大吉,跑到外国合家欢乐了。最终,留下的是一个千疮百孔的家园和体无完肤的土地。 养老金双轨制被指最大不公:公务员6千,农民55元。” 同样是人,一个被包养,一个是散养。养老金关乎人的寿命。少数人的命贵,国家包养到底;多数人的命贱,国家点到为止。是谁在分配养老金的使用?正是这一小部分人。他们老年幸福,是因为他们剥夺了其他更多人老年也要幸福的权力。 杨佩昌:今天和一个德国人聊天。我问:你们的议会有外国人吗?回答:外国人不能担任议员。问:你们国家的官员可以把老婆孩子送国外,独自在德国当官吗?答:如有这样的官,媒体要乐晕了。问:你们官员可以偷偷在国外存款吗?答:如果发生这样的事情,政府就下台了。该德国人反问:有这样的国家吗?我不敢回答。
【移民不移居,掏空中国】中国有近一半的千万富豪已移民或在考虑移民,带走了在国内赚取的大笔财富。转换国籍,子女留在国外,富人回头继续在中国挣钱发财。他们大多有官府背景,靠政策红利致富。 评:世上最可悲的不是“贼去楼空”,而是楼已经空了,贼仍然不走!!! 特困成啥了!!
【最新贫富划分】 1、富人家庭:年入200万以上。 2、富裕家庭:年入80万-200万。 3、中产家庭:年入40万-80万。 4、小康家庭:年入20万-40万。 5、贫穷家庭:年入10万-20万。 6、特困家庭:年入10万以下。 属于特困家庭的请自觉转发! 对不起,拖祖国后腿了! 中国统计局宣布:“中国城市人均月收入已突破9000人民币大关。 拖祖国后腿的朋友们请您自觉转发。” 看到这个消息我不禁黯然神伤,无语了, 我必须要转发。仔细的盘算盘算,我何止是拖了祖国的后腿呀, 我都拖到祖国的大腿根部了,对不起了,祖国!!!都把你的裤衩拖掉了!

Asp.Net MVC 利用Route实现静态图片的动态修改尺寸

由于一个系统里上传的图片通常比较大,而放到一些手机上的时候需要修改大小,主要目的
一是减小数据量,
二是让图片缩放更美观一些,不至于大图缩小后看不清,
三可以不修改现有的图片链接
由于整个系认都是基于Asp.Net的MVC框架开发的,自然也想用MVC来实现这个功能,最终实现如下的效果
直接传入参数width,不传height的情况下,会按原图比例修改大小,否则按指定的宽度高度缩放
我们知道在mvc下有一个很重要的功能,就是Route,默认情况下,你的请求会被提交到哪个Controller,执行哪个Action完全取决于Route的配置。
系统中默认是将这些配置放在RouteTable中,我门可以通过RouteTable.Routes.MapRoute方法添加一个规则,默认情况下,Route是不会处理已存在的静态文件的,我们可以通过设置RouteTable.Routes.RouteExistingFiles=true的方式来实现MVC对静态文件的处理,但这是一个全局属性,一旦设置了,就会影响到所有请求过来的静态文件。
经过一整天的不断尝试:
包括尝试利用IHttpModule截获请求,但是如果设置RouteTable.Routes.RouteExistingFiles=true,可以进入Module,但如果设为false,就不走我的Module了,猜测应该是UrlRouteModule先执行了,试着改变Module顺序也无效
换成IHttpHandler直接处理静态文件,可以用,但是参数需要我自己处理,由于习惯了MVC,参数也懒得处理了,而且这样设置,其他相同扩展名的静态文件全部要经过这个处理器,显然我不想这么复杂。
最后用直接设置RouteTable.Routes.RouteExistingFiles=true的方式,添加Controller、Action,直接实现,图片是可以修改尺寸了,但一些其他的静态文件却反回了404错误,考虑应该是Route的问题,有没有办法让这些特殊的文件只走我指定的那个Route,不符合就继续使用默认的静态文件处理流程呢?
最后在一次调试过程中发现Route本身带有RouteExistingFiles属性,这是我之前从没注意到的,甚至连RouteData的其他属性都没细看过,可不可以将全局的RouteExistingFiles属性设为true,再将单个不需要处理静态文件的Route设为false的方式实现呢?
虽然看起来有点麻烦,但好在Route不多,只有四个,很快就改完了,
刷新页面:静态文件、样式等都正常读取到了,
再刷新要修改的图片,图片可以被正常修改为指定的尺寸,同时利用这一特性,还可以适当的添加一些防盗链功能。
整个方案近乎完美解决了,不需要添加额外的Module和Handler。

至于有没有后遗症,也只能明天再试试了。
---------后话--------------
后来又想,如果将全局属性设为false,将要处理静态文件的Route设为true,可不可行呢?
最后测试发现,在全局属性为false的情况下,会直接作为静态文件处理,猜测应该是先判断了全局属性,然后判断里面可用于静态文件的Route是否符合条件

一个由null值引发的问题

今天在使用System.Data.Entity.SqlQuery执行sql语句时,发现如果传入的参数值中包含null,就会报参数化查询xxxx需要参数 '@xxx',但未提供该参数。"。
遂考虑是否是因为传入了null之后,该参数值在执行时不再提交到数据库导致参数丢失,尝试在设置参数时加一个三元表达式: xx==null?DBNull.Value:(object)xx 后问题果然解决
 
基本示例如下:
有一存储过程

create proc Test
@p1 nvarchar(50),
@p2 nvarchar(50)=null
as
begin
    select @p1,@p2
end
 

用SqlQuery<Model>()方法执行
 

SqlQuery<Model>("Test @p1=@p1,@p2=@p2",new SqlParameter("@p1",1),new SqlParameter("@p2",null))

 
此时为参数@p2设置的值为null(c#),而且在存储过程中默认为null(sql),如果要传入null(sql),可以将sql语句中的@p2参数去掉或直接赋值为null(sql)
如 :Test @p1=@p1,@p2=null 或Test @p1=@p1,在这里,null直接包含在sql语句中,所以表示的是数据库中的null值
 
虽然通过筛选参数的方式能够解决此问题,但实际使用中可能会有多个参数,如果一个一个判断后再输出对应的语句就显得太麻烦了,最简单的就是将所有可传的参数一次传入
 

SqlQuery<Model>("Test @p1=@p1,@p2=@p2",new SqlParameter("@p1",1),new SqlParameter("@p2",p2==null?DBNull.Value:(object)p2))

 
这样就直接将@p2的值设为数据库中的null,同时在非null值的情况下我们又可以传入对应的参数值
这里由于p2可能是其他类型,总之不是DBNull类型,而三元表达式要求是与否的返回类型必须一致,所以添加一个object的强制转换
 
其实不仅是EF,在SqlCommand中直接这样调用存储过程时,也是要这样处理,只是我发现这个问题是由EF引出,归其原因就是c#中的null无法直接转换为DBNull.Value的值
 

有信网络电话-真实免费的网络电话

今天与大家分享的是一款网络电话软件,也是唯一一款我从塞班开始用到现在的网络电话软件,之所以能用这么长时间,主要是因为用这款软甲打电话还从未花过钱,而且能直接拨打手机、固定电话,无需像Line那种QQ式的通讯工具,必须同时在线才可以,同时他又不需要你必须充值才可以使用。

有信支持回拨及网络直拨两种通话方式,回拨收费为网络直拨通话的两倍,直拨一分钟5分钱,这也几乎是这个行业的最低资费了。

同时,有信支持有信用户间的免费网络通话,这就类似QQ聊天了,不多介绍。

之前我曾使用过其他的手机号,并且冲过一次30元的话费,但一直没用完过,因为看了下图依旧会知道原因了

王风坤的博客有信网络电话-真实免费的网络电话 第1张

赠送的话费已经远高于充值话费了,而且每次通话都是先扣除赠送的费用,赠送话费与充值费用除了在优先使用上有区别外,无任何其他区别。

下面是我用新号码申请的,账户余额只有17.21元,这是纯粹的赠送金额,而且最近两个月一直没怎么签到,因为我的电话实在太少,基本上每周就一个电话,最多半小时,而且用这个拨打半小时才1.5元,况且现在有信除了一直存在的签到送话费外,又推出了装软件送话费(以前也有,但力度没这么大,越来越感觉有信网络电话像是装这些软件附赠的了),如果你有iso设备,你会发现在ios设备上装软甲赠送的时间更多,基本上在半小时左右。

王风坤的博客有信网络电话-真实免费的网络电话 第3张

上面只是手机上的,登陆其网站会有更多任务,主要以游戏推广为主,而且游戏赠送时间普遍较多(看来游戏公司从来不差钱儿)。

王风坤的博客有信网络电话-真实免费的网络电话 第5张

官方推荐下载 ← 这个链接其实是推广链接,一般注册后会给您和我增加一些初始话费,好像是20-30分钟

为wordpress添加第三方评论系统及相关文章推荐功能

几乎每个周末都是我折腾博客的时间,因为只有周末才有足够的时间修改错误,上个周找了两个缓存插件,一个数据库缓存,一个页面缓存。

放上后观察了一一个周,发现效果不尽人意,索性直接给关掉了,因为新站,估计除了几个蜘蛛来经常串串门,也就我自己经常上了,感觉现在注缓存问题有点为时过早。

上周还同时开通了wordpress自带的垃圾评论过滤功能,试了一下,还可以,就是当初申请的时候遇到了点麻烦,主要是看不懂英文。

但今天我决定关掉它,换第三方的产品来代替wordpress自己的评论系统,主要是因为

1.用wordpress自带的评论系统,我需要同时开启一个插件功能过滤垃圾评论,而插件是非国内提供,说不定哪天就像谷歌一样被抽风了

2.自带的评论系统必然会带来系统消耗,作为我这样连草根都算不上的贫民,没能力买好的空间,能省则省了

3.第三方的评论系统一般都带有垃圾评论过滤功能,这样就可以少开一个插件了,又节省了一部分系统资源

4.目前国内的几大评论系统都提供了账户、微博集成功能,可以很方便的使用现有的QQ号、微博号登陆并评论,免去了我下载插件或自己实现(这几乎不可能)所带来的工作量

5.避免了评论系统或插件可能带来的漏洞、BUG、不兼容等问题而影响网站的其他正常功能

说完了有点再说一下缺点

1.如果你不打算做对接接口或定是导出数据,那你的数据将掌握在别人手中,也就是把评论数据的安全交给了别人,一旦发生问题或纠纷可能对你不利

2.评论系统是否正常运行完全依赖与第三方服务是否稳定

3.对第三方评论做深入的开发可能会很难

4.后台无法显示评论数量及相关统计,你只能却对方后台去查,而且很可能无法提供你要的结果

5.由于需要修改模板代码,在更换模板时可能需要同时修改相应的代码,而且更新模板时也可能需要重新添加

其实,用不用第三方评论系统还是看自己的侧重点在哪吧,如果你想对评论系统进行深层次开发,那你只能用自带的评论系统,因为这个是允许你自由扩展的,如果是第三方的,你需要借助其接口来实现,可能会带来更多的工作量,如果像我一样,评论系统只是给用户一个对内容进行反馈的平台,那就非常适合用第三方评论了。

在wordpress中添加第三方评论系统之前需要先申请安装代码,我用的是多说的评论系统,当然还有其他的,如:友言。之所以选择多说,是因为之前有他的账号,所以就直接拿来用了,其实两家的系统基本是相同的,细节上可能有些许不一样的地方,但对我来说能说话就行。

申请到代码后,到wordpress后台找到外观-编辑,从模板中找到评论模板comments.php,将代码添加到第一个<?php之前 ,并在<?php 后面添加 return; 语句来屏蔽后面的php代码。

同时根据需要看一下页面上是否还有评论相关的代码,比如content.php中是否有评论数量等。

添加完了评论系统,再顺便添加一个相关文章推荐系统,一个好的相关文章推荐系统,应该是根据文章内容相关度计算出来的,如果我们自己去实现,可能需要做大量的测试、改进工作,不过这种系统也有第三方的了,如:无觅、友荐等,两家不分伯仲。

我选择的是友荐可能是先入为主的原因吧,因为第一次看到这种相关文章推荐时就是友荐,后来又发现相似的还有无觅。

由于都是第三方系统而非系统插件,所以添加方法跟评论系统相似,找到相关页面,嵌入代码即可,相关文章一般应用在文章页面中,所以只需要找到文章页面single.php,在评论模板调用评论模板<?php comments_template( '', true ); ?>之前,加上相关文章代码即可,同时你也可以直接将其放入到评论模板中,但不推荐这种做法。

至此第三方评论系统及相关文章系统添加完毕,新添加的相关文章系统需要等待系统抓取你的网站后才能显示出相关内容,但通常比搜索引擎快得多,一般是加上后,刷新一下页面就开始抓取了,如果你的文章很多可能需要更长的时间。

8094593

看一下效果,还不错吧。