Yzl的研究室

一切都是幻觉
 
 

与我联系

  • 发短消息

搜索

 

常用链接

  • 我的随笔
  • 我的空间
  • 我的短信
  • 我的评论
  • 更多链接
  • 我的参与
  • 我的新闻
  • 最新评论
  • 我的标签

留言簿(1)

  • 给我留言
  • 查看留言

我参与的团队

  • 北京.NET俱乐部(0/1409)

我的标签

  • LINQ(2)
  • 多表操作(1)
  • 分页(1)
  • 算法 ACM(1)
  • WPF SilverLight(1)
  • Linq Monorail(1)
  • SilverLight(1)
  • WPF(1)
  • Gzip(1)
  • Ajax(1)
  • 更多

随笔分类(8)

  • [.NET]LINQ To SQL(4) (rss)
  • [.NET]Performance && Optimization (rss)
  • [.NET]WPF/SilverLight(2) (rss)
  • [Web]Development(1) (rss)
  • Data Structures and Algorithms(1) (rss)
  • SQL Server (rss)

随笔档案(12)

  • 2008年6月 (2)
  • 2008年3月 (10)

积分与排名

  • 积分 - 29651
  • 排名 - 1330

最新评论

  • 1. re: Resharper 4.0出来了
  • 之前用3.0,小项目还好,大项目的话打开太慢了,受不了,卸掉了。4.0会不会好点?
  • --Yidon
  • 2. re: Resharper 4.0出来了
  • good ,没有 resharper 的 visual studio.NET 是不完整的
  • --loohb
  • 3. re: 破解SQL Prompt 3.8..
  • 最近吃散伙饭,天天醉生梦死。。。哎。。。
  • --yzlhccdec
  • 4. re: 破解SQL Prompt 3.8..
  • 没研究了,我重现不了那个错误。。。
  • --yzlhccdec
  • 5. re: 破解SQL Prompt 3.8..
  • LZ大大。我的问题搞定了吗??我弄不出来啊。。。。
  • --蜗牛身上的一只蚂蚁

阅读排行榜

  • 1. 关于三层架构的一些疑问(7083)
  • 2. 为WPF/SilverLight的学习者们打气(3043)
  • 3. Resharper 4.0出来了(2899)
  • 4. 破解SQL Prompt 3.8..(2139)
  • 5. WPF性能校调(2063)

评论排行榜

  • 1. 关于三层架构的一些疑问(66)
  • 2. Resharper 4.0出来了(38)
  • 3. 破解SQL Prompt 3.8..(35)
  • 4. 为WPF/SilverLight的学习者们打气(25)
  • 5. 使用LINQ进行多表操作(一)(6)

Powered by: 博客园
模板提供:沪江博客
博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅订阅 | 管理

2008年6月17日

破解SQL Prompt 3.8..

累了累了,再也不搞了,按惯例1天后删除.
效果如下

破解包下载
说明附到里面了....

这里是破解过程
睡觉去.....

好像在中文OS下面会出问题,那个知道原因的望指教,小弟第一次用IL反编译工具,不晓得是不是跟OS语言版本有关系

posted @ 2008-06-17 06:16 yzlhccdec 阅读(2139) | 评论 (35) | 编辑
 

2008年6月15日

Resharper 4.0出来了
下载地址:http://download.jetbrains.com/resharper/ReSharperSetup.4.0.msi
算号器下载(花了几个小时把它XXOO了,这是算号器,晚上就删了,请勿用于商业用途哟)(已删除
)
我VS 2008 SP1装了之后无法使用Resharper提供的Intellisense,不知道大家有没有这个问题?
posted @ 2008-06-15 11:25 yzlhccdec 阅读(2899) | 评论 (38) | 编辑
 

2008年3月24日

Ajax缓存问题

今天把网站部署到服务器上之后,发现了以前在本机调试的时候从来没有出现过的问题:在我明明在Http请求头中强制设定了Cache-Control:no-store,但Ajax请求竟然还会缓存数据。
但是这个问题只出现在IE6上面。后来我发现服务器对动态文件也开启了Gzip,关掉之后问题立刻就解决了。
到Google上一搜,原来是IE6的BUG,残念.......
http://support.microsoft.com/kb/321722
看样子还得老老实实用伟大的随机数大法了。。。

posted @ 2008-03-24 21:09 yzlhccdec 阅读(71) | 评论 (0) | 编辑
 

2008年3月21日

MonoRail和Linq To SQL的兼容性问题

今天无意中发现的一个兼容性问题。如果你使用了Monorail+Linq进行开发,这个问题很值得注意。
我在项目中使用Linq内置的OnXXXChanged/OnXXXChanging进行数据有效性验证,比如

partial void OnTopicChanging(string value)
      
{
            
if (!value.IsLengthIn(1, 100))
                
throw new DataException("主题不符合要求,请返回重新填写");
        }

然后在前台用SmartDispatcherController进行数据绑定,比如
public void Post([DataBind("article")]ArticleInfo articleInfo)
{}

然后我在Globle.ascx.cs中进行未处理异常的捕获

但奇怪的是,当OnTopicChanging中的异常发出后,Globle.ascx.cs竟然无法捕获。也就是说,如果你直接像我这样绑定数据并处理异常的话,是无法得到想要的结果的。
其实原因很简单,SmartDispatcherController在数据绑定的时候用了一个try catch,然后把绑定过程中发生的所有错误全部截获,并放到了BoundInstanceErrors中去了。
解决方法有两个:1.判断BoundInstanceErrors的Count并做相应处理;2.把OnTopicChanging中的验证移到OnValidate中去....
怨念啊~~~我不知道ASP.NET MVC是否存在类似的问题,有条件的朋友可以测试一下。

posted @ 2008-03-21 16:52 yzlhccdec 阅读(1800) | 评论 (2) | 编辑
 

2008年3月20日

WPF性能校调
声明:本文写于2007年4月8号,差不多一年前,之后我就没用过WPF了,不知道现在改了多少,麻烦大家自己筛选一下。
 

一、Rendering Tier

1.       根据硬件配置的不同,WPF采用不同的Rendering Tier做渲染。下列情况请特别注意,因为在这些情况下,即使是处于Rendering Tier 2的情况下也不会硬件加速。(不全,其余请查阅SDK)

Bitmap effects, Printed content, Tiled content that uses TileBrush, Layered windows.

下列情况为Layered window: 1. WindowStyle = none, 2.AllowsTransparency = true, 3.Background = Transparent.

二、布局和设计

1.尽量多使用Canvas等简单的布局元素,少使用Grid或者StackPanel等复杂的,越复杂性能开销越大。

2.建立逻辑树或者视觉树的时候,遵循Top-Down的原则。示例代码如下:

C# 

private void OnBuildTreeTopDown(object sender, RoutedEventArgs e)

{

    TextBlock textBlock = new TextBlock();

    textBlock.Text = "Default";

    DockPanel parentPanel = new DockPanel();

    DockPanel childPanel;

    myCanvas.Children.Add(parentPanel);

    myCanvas.Children.Add(textBlock);

    for (int i = 0; i < 150; i++)

    {

        textBlock = new TextBlock();

        textBlock.Text = "Default";

        parentPanel.Children.Add(textBlock);

        childPanel = new DockPanel();

        parentPanel.Children.Add(childPanel);

        parentPanel = childPanel;

    }

}

三、图像

1.     对Image做动画处理的时候(如调整大小等),可以使用这条语句RenderOptions.SetBitmapScalingMode(MyImage,BitmapScalingMode.LowQuality),以改善性能。

2.     用TileBrush的时候,可以CachingHint。

四、对象行为

1.访问CLR对象和CLR属性的效率会比访问DependencyObject/DependencyProperty高。注意这里指的是访问,不要和前面的绑定混淆了。但是,把属性注册为DependencyProperty会有很多的优点:比如继承、数据绑定和Style。所以有时候我们可以在实现DependencyProperty的时候,利用缓存机制来加速访问速度:看下面的缓存例子:

public static readonly DependencyProperty MagicStringProperty = 
    DependencyProperty.Register(
"MagicString", typeof(string), typeof(MyButton), new PropertyMetadata(new PropertyInvalidatedCallback(OnMagicStringPropertyInvalidated),new GetValueOverride(MagicStringGetValueCallback)));

 
private static void OnMagicStringPropertyInvalidated(DependencyObject d)
 
{
    
// 将缓存的数据标识为无效
    ((MyButton)d)._magicStringValid = false;
 }


 
private static object MagicStringGetValueCallback(DependencyObject d)
 
{
    
// 调用缓存的访问器来获取值
    return ((MyButton)d).MagicString;
 }


 
// 私有的CLR访问器和本地缓存
 public string MagicString
 
{
    
get
    
{
      
// 在当前值无效时,获取最新的值保存起来
      if (!_magicStringValid)
      
{
        _magicString 
= (string)GetValueBase(MagicStringProperty);
        _magicStringValid 
= true;
      }

      
return _magicString;
    }

    
set
    
{
      SetValue(MagicStringProperty, value);
    }

 }


 
private string _magicString;
 
private bool _magicStringValid;


另外,因为注册的DependencyProperty在默认是不可继承的,如果需要继承特性,也会降低DependencyProperty值刷新的效率。注册DependencyProperty属性时,应该把DefaultValue传递给Register方法的参数来实现默认值的设置,而不是在构造函数中设置。

 

五、应用程序资源

1. 在自定义控件,尽量不要在控件的ResourceDictionary定义资源,而应该放在Window或者Application级。因为放在控件中会使每个实例都保留一份资源的拷贝。

2. 尽量使用Static Resources,但不能盲目使用。

六、文本

1. 文字少的时候用TextBlock或者label,长的时候用FlowDocument.

2. 使用元素TextFlow和TextBlock时,如果不需要TextFlow的某些特性,就应该考虑使用TextBlock,因为它的效率更高。

3. 在TextFlow中使用UIElement(比如TextBlock)所需的代价要比使用TextElement(比如Run)的代价高.在FlowDocument中尽量避免使用TextBlock,要用Run替代。代码如下:

<FlowDocument>

 <!-- Text content within a Run (more efficient). -->

 <Paragraph>

    <Run>Line one</Run>

 </Paragraph>

 <!-- Text content within a TextBlock (less efficient). -->

 <Paragraph>

    <TextBlock>Line two</TextBlock>

 </Paragraph>

</FlowDocument>

4. 在TextBlock中显式的使用Run命令比不使用Run命名的代码要高。

<!-- Run is used to set text properties. -->

<TextBlock>

 <Run FontWeight="Bold">Hello, world</Run>

</TextBlock>

<!-- TextBlock is used to set text properties, which is more efficient. -->

<TextBlock FontWeight="Bold">

 Hello, world

</TextBlock>

5. 把Label(标签)元素的ContentProperty和一个字符串(String)绑定的效率要比把字符串和TextBlock的Text属性绑定的效率低。因为Label在更新字符串是会丢弃原来的字符串,全部重新显示内容。如果字符串不需要更新,用Label就无所谓性能问题。

6. 在TextBlock块使用HyperLinks时,把多个HyperLinks组合在一起效率会更高。

<!-- Hyperlinks in separate TextBlocks. -->

<TextBlock>

 <Hyperlink TextDecorations="None" NavigateUri="http://www.msn.com">MSN Home</Hyperlink>

</TextBlock>

<TextBlock Text=" | "/>

<TextBlock>

 <Hyperlink TextDecorations="None" NavigateUri="http://my.msn.com">My MSN</Hyperlink>

</TextBlock>

<!-- Hyperlinks combined in the same TextBlock. -->

<TextBlock>

 <Hyperlink TextDecorations="None" NavigateUri="http://www.msn.com">MSN Home</Hyperlink>

 

 <Run Text=" | " />

 

 <Hyperlink TextDecorations="None" NavigateUri="http://my.msn.com">My MSN</Hyperlink>

</TextBlock>

7. 显示超链接的时候,尽量只在IsMouseOver为True的时候显示下划线,一直显示下划线的代码高很多

8. 尽量不使用不必要的字符串连接。

七、数据绑定

1.在使用数据绑定的过程中,如果绑定的数据源是一个CLR对象,属性也是一个CLR属性,那么在绑定的时候对象CLR对象所实现的机制不同,绑定的效率也不同。

A、数据源是一个CLR对象,属性也是一个CLR属性。对象通过TypeDescriptor/PropertyChanged模式实现通知功能。此时绑定引擎用TypeDescriptor来反射源对象。效率最低。

B、数据源是一个CLR对象,属性也是一个CLR属性。对象通过INotifyPropertyChanged实现通知功能。此时绑定引擎直接反射源对象。效率稍微提高。

C、数据源是一个DependencyObject,而且属性是一个DependencyProperty。此时不需要反射,直接绑定。效率最高。

2.当一个CLR对象很大时,比如有1000个属性时,尽量把这个对象分解成很多很小的CLR对象。比如分成1000个只有一个属性的CLR对象。

3. 当我们在列表(比如ListBox)显示了一个CLR对象列表(比如List)时,如果想在修改List对象后,ListBox也动态的反映这种变化。此时,我们应该使用动态的ObservableCollection对象绑定。而不是直接的更新ItemSource。两者的区别在于直接更新ItemSource会使WPF抛弃ListBox已有的所有数据,然后全部重新从List加载。而使用ObservableCollection可以避免这种先全部删除再重载的过程,效率更高。

4. 尽量绑定IList而不是IEnumerable到ItemsControl。

八、其它性能建议

1. 如果需要修改元素的Opacity属性,最后修改一个Brush的属性,然后用这个Brush来填充元素。因为直接修改元素的Opacity会迫使系统创建一个临时的Surface

2. 用NavigationWindow的时候,尽量Update the client area by object,而不是URI

3. 尽量不要使用ScrollBarVisibility=Auto

posted @ 2008-03-20 09:23 yzlhccdec 阅读(2063) | 评论 (1) | 编辑
 
为WPF/SilverLight的学习者们打气
最近园子里面学习WPF/SilverLight的同志们越来越多了,我把一年前做的WPF的一个Demo发上来,让还在犹豫要不要学的兄弟们看看,咱用WPF/SilverLight做效果也绝对不比Flash/Flex差,呵呵。
http://www.cnblogs.com/Files/yzlhccdec/Debug.rar
这里是源代码


大家开发WPF/SilverLight的时候一定要用Blend!!!!VS 2008根本就不是做美工的。。顶多写写cs代码
对了,装了Blend之后会有几个Sample,都很炫的

 

你们先继续探索,我随后跟进......

另外 这里是yahoo用WPF开发的Messenger 效果也是非常不错的,不过有点慢....
posted @ 2008-03-20 01:47 yzlhccdec 阅读(3043) | 评论 (25) | 编辑
 
.Net中Char的长度
以前一直在c++中用Char表示一个字节的数据,今天刚发现在C#中Char是两个字节的。我倒。。。。
posted @ 2008-03-20 00:50 yzlhccdec 阅读(59) | 评论 (0) | 编辑
 

2008年3月16日

一个ACM在线提交系统,支持c#提交
有时间还是学学算法吧,反正有好处就得了。
http://www.spoj.pl
好不容易找到这个支持c#在线提交的题库
posted @ 2008-03-16 18:13 yzlhccdec 阅读(86) | 评论 (1) | 编辑
 

2008年3月13日

关于三层架构的一些疑问

1.我们在设计网站的时候,经常有前台用于展现的实体和后台用于持久化的实体不完全相同的情况。比如星座这种数据,在后台存的可能是一个tinyint值,但是在前台显示的时候肯定要转成“某某座”这样,对于这种情况,我现在的处理方法是建立PO,VO两种对象,但现在有两个问题:1.VO、PO定义在哪?是分别定义到自己所属的层,不允许穿透?还是统一定义到Model层里面去?2.VO<->PO在哪进行转换?(如果都放到BLL层,会造成BLL层过于臃肿。如果放到对象内部的话,有时候又不得不在对象内部调用持久化方法,虽然我现在的做法是把不依赖于持久化的方法放到对象内部,但是总觉得这样的话逻辑过于分散,不好管理)

2.BLL到底是写成实体类好还是静态类好?我曾经看过CM的代码,发现它BLL层的方法全是Static的,我个人也觉得用Static是不是会好一点?因为我暂时没碰到过BLL里面要继承或者是实现接口的。

3.自从DLINQ出现后,对传统的三层架构有了一点影响。因为LINQ本身可以作为一个Thin DAL使用,当然也可以在它的基础上再封装一次,实现DAL接口。不过我的问题是,如果我们把LINQ封装起来用的话,岂不是LINQ带来的动态生成查询的好处就不存在了?因为如果采用实现接口的形式的话,其返回类型势必不能是IQueryable。

posted @ 2008-03-13 02:19 yzlhccdec 阅读(7083) | 评论 (66) | 编辑
 

2008年3月11日

使用LINQ进行多表操作(二)
      1:M或者M:M关系的多表操作

表结构如下

 

直接写表达式

//正常选取
var user = context.Users.Where(p => p.UserID == 10300).Select(p => new {p, p.UserTags})
//带条件选取
var user = context.Users.Where(p => p.UserID == 10300).Select(p => new {p, UserTags = p.UserTags.Where(o => o.TagID > 10)})

SELECT [t0].[UserID], [t0].[Email], [t0].[NickName], [t1].[UserID] AS [UserID2], [t1].[TagID], (
    
SELECT COUNT(*)
    
FROM [dbo].[UserTag] AS [t2]
    
WHERE [t2].[UserID] = [t0].[UserID]
    ) 
AS [value]
FROM [dbo].[Users] AS [t0]
LEFT OUTER JOIN [dbo].[UserTag] AS [t1] ON [t1].[UserID] = [t0].[UserID]
WHERE [t0].[UserID] = 10300
ORDER BY [t0].[UserID], [t1].[TagID]

使用LoadOption选项

var option = new DataLoadOptions();
option.AssociateWith<User>(p => p.UserTags.Where(o => o.TagID > 10));
context.LoadOptions = option;
var user 
= context.Users.Where(p => p.UserID == 10300).Single();
var userTags 
= user.UserTags;

这里要把LoadWith改成AssociateWith,因为LoadWith后面的参数只能以*.*这种形式出现,说白了就是只能是一整条记录,而且不能加过滤任何条件

使用Join语句

     使用方法也和之前的一样,另外我们还可以用Contains()来实现同样的效果,翻译成的SQL语句也会相应的变成EXISTS 或者 IN.

     总结
     总的来说,我还是觉得如果要进行多表操作的话Join是首选。至于LoadOption,我只能感慨“既生Join,何生LoadOption”,当然如果LoadOption还有隐藏必杀技的话,希望知道的朋友可以告诉我。
     对于1:M或者M:M的关系,不论用上面哪种方法,都会选出一堆重复数据,如果我不想要那些重复数据怎么办?对于1:M关系的数据还好说,直接取2次就成了,但是对于M:M的呢?我现在的做法是第一次取了之后,把参数转成字符串,然后再到SQL里面去Split(用CLR函数),不知道还有没有更好的办法?

 

posted @ 2008-03-11 18:04 yzlhccdec 阅读(1435) | 评论 (1) | 编辑
 
仅列出标题  下一页