<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>进化的测试 &#187; LINQ</title>
	<atom:link href="http://magustest.com/blog/tag/linq/feed/" rel="self" type="application/rss+xml" />
	<link>http://magustest.com/blog</link>
	<description>关注软件测试，白盒测试，自动化测试，性能测试</description>
	<lastBuildDate>Wed, 02 Jun 2010 16:12:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Linq to Object在测试中的应用</title>
		<link>http://magustest.com/blog/whiteboxtesting/using-linq-to-object-in-testing/</link>
		<comments>http://magustest.com/blog/whiteboxtesting/using-linq-to-object-in-testing/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 03:34:50 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[白盒测试]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[集成测试]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=563</guid>
		<description><![CDATA[.NET Framework 3.5中引入了一个新特性LINQ（集成语言查询），据说.NET Framework 3.5中很多特性都是为LINQ而服务的，例如Lambda表达式的支持，匿名类型，等等……这篇文章会讲述一个把Linq to Object应用于测试的例子。 前一阵子需要测试一个搜索在线会员的功能，如果一个用户是在线的，那么他所能够被搜索到的信息都会作为一条记录，保存在一个表中，主要的字段有5个，也就是根据这5个字段的信息可以查询出用户想要的在线会员。一个简单的方案就是写一个比较复杂的存储过程，然后根据5个输入来查询出不同的结果，不过DBA说在SQL SERVER中进行逻辑运算的性能不是很好，所以开发人员写了12条存储过程，分别对应不同的组合，那么对于我做集成测试来说，我起码要有12个测试方法对应这12条存储过程。同时我还要设计一定数量的测试数据，供我查询测试，而比较要命的是，这些测试数据随着我对这个功能的理解的深入，在不断地增加，结果就是如果我写第一个测试的时候，我准备的数据是30条，OK，测试通过；等我写到第五个测试的时候，测试数据可能有40条了，当我用这40条测试数据重新指向第一个测试的时候，FAILED!!!这让人非常郁闷。所以我想到了能不能用round trip的方法来进行测试。做一个比喻，假如说我想证明WIN7的计算器程序是正确的，那么可以把相同的计算在WIN XP的计算器中跑一遍，如果两者结果一样，那么我可以认为WIN7的计算器程序也是正确的（如果XP的计算器有错怎么办？先别较真，有风险，但很小）。 我的做法就是，准备一些数据，首先用SUT进行查询，然后用LINQ进行查询，如果两者查询结果一致，那么可以认为程序是正确的，否则就是两者之一存在问题。 首先准备一些测试数据，保存为XML文件，第一方便对测试数据进行CRUD，第二可以用XmlSerializer把这些数据转换为对象，方便用LINQ查询。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 &#60; ?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34; ?&#62; &#60;onlinefriends&#62; &#60;friends&#62; &#60;onlinefrienddata&#62; &#60;friendid&#62;1300010000&#60;/friendid&#62; &#60;province&#62;北京市&#60;/province&#62; &#60;city&#62;北京市&#60;/city&#62; &#60;age&#62;18&#60;/age&#62; &#60;gender&#62;2&#60;/gender&#62; [...]


Related posts:<ol><li><a href='http://magustest.com/blog/net/automatic-generate-xml-instance-by-using-xsd/' rel='bookmark' title='Permanent Link: 用XSD自动生成XML对应的.NET实体类'>用XSD自动生成XML对应的.NET实体类</a></li>
<li><a href='http://magustest.com/blog/whiteboxtesting/data-driven-test-in-unit-test/' rel='bookmark' title='Permanent Link: 在单元测试中应用数据驱动'>在单元测试中应用数据驱动</a></li>
<li><a href='http://magustest.com/blog/softwaretesting/using-httpcontext-in-unittest/' rel='bookmark' title='Permanent Link: 在C#单元测试中使用HttpContext的简单解决办法'>在C#单元测试中使用HttpContext的简单解决办法</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>.NET Framework 3.5中引入了一个新特性<a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx" target="_blank">LINQ</a>（集成语言查询），据说.NET Framework 3.5中很多特性都是为LINQ而服务的，例如<a href="http://en.wikipedia.org/wiki/Lambda" target="_blank">Lambda表达式</a>的支持，<a href="http://msdn.microsoft.com/zh-cn/library/bb397696.aspx" target="_blank">匿名类型</a>，等等……这篇文章会讲述一个把Linq to Object应用于测试的例子。</p>
<p>前一阵子需要测试一个搜索在线会员的功能，如果一个用户是在线的，那么他所能够被搜索到的信息都会作为一条记录，保存在一个表中，主要的字段有5个，也就是根据这5个字段的信息可以查询出用户想要的在线会员。一个简单的方案就是写一个比较复杂的存储过程，然后根据5个输入来查询出不同的结果，不过DBA说在SQL SERVER中进行逻辑运算的性能不是很好，所以开发人员写了12条存储过程，分别对应不同的组合，那么对于我做集成测试来说，我起码要有12个测试方法对应这12条存储过程。同时我还要设计一定数量的测试数据，供我查询测试，而比较要命的是，这些测试数据随着我对这个功能的理解的深入，在不断地增加，结果就是如果我写第一个测试的时候，我准备的数据是30条，OK，测试通过；等我写到第五个测试的时候，测试数据可能有40条了，当我用这40条测试数据重新指向第一个测试的时候，FAILED!!!这让人非常郁闷。所以我想到了能不能用round trip的方法来进行测试。做一个比喻，假如说我想证明WIN7的计算器程序是正确的，那么可以把相同的计算在WIN XP的计算器中跑一遍，如果两者结果一样，那么我可以认为WIN7的计算器程序也是正确的（如果XP的计算器有错怎么办？先别较真，有风险，但很小）。</p>
<p>我的做法就是，准备一些数据，首先用SUT进行查询，然后用LINQ进行查询，如果两者查询结果一致，那么可以认为程序是正确的，否则就是两者之一存在问题。</p>
<p>首先准备一些测试数据，保存为XML文件，第一方便对测试数据进行CRUD，第二可以用XmlSerializer把这些数据转换为对象，方便用LINQ查询。<br />
<span id="more-563"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt; ?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;onlinefriends<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;friends<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;onlinefrienddata<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;friendid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1300010000<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/friendid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;province<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>北京市<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/province<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;city<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>北京市<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/city<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>18<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gender<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/gender<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;hasphoto<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/hasphoto<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/onlinefrienddata<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;onlinefrienddata<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;friendid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1300010002<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/friendid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;province<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>北京市<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/province<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;city<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>北京市<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/city<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>27<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gender<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/gender<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;hasphoto<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>false<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/hasphoto<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/onlinefrienddata<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;onlinefrienddata<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;friendid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1300010004<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/friendid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;province<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>广东省<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/province<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;city<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>广州市<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/city<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>45<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;gender<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/gender<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;hasphoto<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/hasphoto<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/onlinefrienddata<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/friends<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/onlinefriends<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>然后需要有一个类，利用XmlSerializer来反序列化这些测试数据</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>XmlRoot<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;OnlineFriends&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> OnlineFriends
<span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">private</span> <span style="color: #FF0000;">bool</span> IsEmpty <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
&nbsp;
	<span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> OnlineFriends fs <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> OnlineFriends<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
	<span style="color: #0600FF;">private</span> OnlineFriends<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> OnlineFriends Instance
	<span style="color: #000000;">&#123;</span>
		get
		<span style="color: #000000;">&#123;</span>
			<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>fs.<span style="color: #0000FF;">IsEmpty</span><span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				fs.<span style="color: #0000FF;">Deserialize</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
			<span style="color: #000000;">&#125;</span>
			<span style="color: #0600FF;">return</span> fs<span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> Deserialize<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		var serialzer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> XmlSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>OnlineFriends<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span>XmlReader xmlreader <span style="color: #008000;">=</span> XmlReader.<span style="color: #0000FF;">Create</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;OnlineFriends.xml&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#123;</span>
			fs <span style="color: #008000;">=</span> serialzer.<span style="color: #0000FF;">Deserialize</span><span style="color: #000000;">&#40;</span>xmlreader<span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">as</span> OnlineFriends<span style="color: #008000;">;</span>
			fs.<span style="color: #0000FF;">IsEmpty</span> <span style="color: #008000;">=</span> false<span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> OnlineFriendData
	<span style="color: #000000;">&#123;</span>
		<span style="color: #000000;">&#91;</span>XmlElement<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;FriendId&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
		<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> FriendId <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #000000;">&#91;</span>XmlElement<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Province&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
		<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Province <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #000000;">&#91;</span>XmlElement<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;City&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
		<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> City <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #000000;">&#91;</span>XmlElement<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Age&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
		<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> Age <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #000000;">&#91;</span>XmlElement<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Gender&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
		<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">byte</span> Gender <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #000000;">&#91;</span>XmlElement<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;HasPhoto&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
		<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> HasPhoto <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
&nbsp;
	<span style="color: #000000;">&#91;</span>XmlArray<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Friends&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
	<span style="color: #000000;">&#91;</span>XmlArrayItem<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;OnlineFriendData&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
	<span style="color: #0600FF;">public</span> OnlineFriendData<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> Friends <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>数据的准备工作就差不多了，看一个简单的测试。首先这个测试方法会重新初始化测试数据，然后查询27岁的在线会员，查询出来的结果保存在ids的INT列表中。OnlineFriends.Instance.Friends对象中保存了所有在线好友的数据，它是一个实现了IEnumerable<t>接口的类，所以可以使用LINQ相关的<a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx" target="_blank">扩展方法</a>。</p>
<p>在OnlineFriends.Instance.Friends.Where(x => x.Age == age)语句中，“x => x.Age == age”是一个应用了Lambda表达式的匿名委托，整个语句的意思就是在OnlineFriends.Instance.Friends这个集合中，找到年龄==age的元素。</p>
<p>不过找到了以后还不行啊，SUT返回的是INT列表，而刚才查到的是OnlineFriendData对象的集合，接下来可以用Select(y => y.FriendId).ToList<int>()对集合做一个投影，只取出FriendId属性，并且转换为INT列表。</p>
<p>最后用CollectionAssert.AreEquivalent()方法对两个INT列表进行比较，看列表是否相等。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>TestMethod<span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> GetOnlineFriendsIdList_Query_Age_LowerUpperDiffOne<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #008080; font-style: italic;">//重新初始化测试数据</span>
	TestHelp.<span style="color: #0000FF;">InitForSearch</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	<span style="color: #FF0000;">int</span> age <span style="color: #008000;">=</span> <span style="color: #FF0000;">27</span><span style="color: #008000;">;</span>
	OnlineFriendQuery query <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> OnlineFriendQuery<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	query.<span style="color: #0000FF;">AgeLowerBound</span> <span style="color: #008000;">=</span> age<span style="color: #008000;">;</span>
	query.<span style="color: #0000FF;">AgeUpperBound</span> <span style="color: #008000;">=</span> age<span style="color: #008000;">;</span>
             <span style="color: #008080; font-style: italic;">//根据条件查询在线会员，在这里就是要查询27岁的会员</span>
	List<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span> ids <span style="color: #008000;">=</span> FriendListGateway.<span style="color: #0000FF;">FriendListProvider</span>.<span style="color: #0000FF;">GetOnlineFriendsIdList</span><span style="color: #000000;">&#40;</span>query, MyAllPc<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
	<span style="color: #008080; font-style: italic;">//Two collects are equivalent</span>
	CollectionAssert.<span style="color: #0000FF;">AreEquivalent</span><span style="color: #000000;">&#40;</span>OnlineFriends.<span style="color: #0000FF;">Instance</span>.<span style="color: #0000FF;">Friends</span>.<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x.<span style="color: #0000FF;">Age</span> <span style="color: #008000;">==</span> age<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>y <span style="color: #008000;">=&gt;</span> y.<span style="color: #0000FF;">FriendId</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToList</span><span style="color: #008000;">&lt;/</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, ids<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
<span style="color: #008000;">&lt;/</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span></pre></td></tr></table></div>

<p>假如使用我最开始的测试方法（就是先准备测试数据，然后人工统计一下里面有多少个27岁的数据，最后进行比较），我在完成了这一条测试以后，接下来还要小心翼翼地添加测试数据，不能再添加年龄是27岁的数据，要不然就会影响到测试结果。但是应用了LINQ以后，我在后续的测试数据设计中就无需要担心新设计的测试数据会对老的测试造成影响。甚至我还可以用程序生成各种不同的数据，填入数据库，供我测试用。</int></t></p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://magustest.com/blog/feed/" title="RSS"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fusing-linq-to-object-in-testing%2F&amp;title=Linq%20to%20Object%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8&amp;annotation=.NET%20Framework%203.5%E4%B8%AD%E5%BC%95%E5%85%A5%E4%BA%86%E4%B8%80%E4%B8%AA%E6%96%B0%E7%89%B9%E6%80%A7LINQ%EF%BC%88%E9%9B%86%E6%88%90%E8%AF%AD%E8%A8%80%E6%9F%A5%E8%AF%A2%EF%BC%89%EF%BC%8C%E6%8D%AE%E8%AF%B4.NET%20Framework%203.5%E4%B8%AD%E5%BE%88%E5%A4%9A%E7%89%B9%E6%80%A7%E9%83%BD%E6%98%AF%E4%B8%BALINQ%E8%80%8C%E6%9C%8D%E5%8A%A1%E7%9A%84%EF%BC%8C%E4%BE%8B%E5%A6%82Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E6%94%AF%E6%8C%81%EF%BC%8C%E5%8C%BF%E5%90%8D%E7%B1%BB%E5%9E%8B%EF%BC%8C%E7%AD%89%E7%AD%89%E2%80%A6%E2%80%A6%E8%BF%99%E7%AF%87%E6%96%87%E7%AB%A0%E4%BC%9A%E8%AE%B2%E8%BF%B0%E4%B8%80%E4%B8%AA%E6%8A%8ALinq%20to%20Object%E5%BA%94" title="Google Bookmarks"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fusing-linq-to-object-in-testing%2F&amp;title=Linq%20to%20Object%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8&amp;bodytext=.NET%20Framework%203.5%E4%B8%AD%E5%BC%95%E5%85%A5%E4%BA%86%E4%B8%80%E4%B8%AA%E6%96%B0%E7%89%B9%E6%80%A7LINQ%EF%BC%88%E9%9B%86%E6%88%90%E8%AF%AD%E8%A8%80%E6%9F%A5%E8%AF%A2%EF%BC%89%EF%BC%8C%E6%8D%AE%E8%AF%B4.NET%20Framework%203.5%E4%B8%AD%E5%BE%88%E5%A4%9A%E7%89%B9%E6%80%A7%E9%83%BD%E6%98%AF%E4%B8%BALINQ%E8%80%8C%E6%9C%8D%E5%8A%A1%E7%9A%84%EF%BC%8C%E4%BE%8B%E5%A6%82Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E6%94%AF%E6%8C%81%EF%BC%8C%E5%8C%BF%E5%90%8D%E7%B1%BB%E5%9E%8B%EF%BC%8C%E7%AD%89%E7%AD%89%E2%80%A6%E2%80%A6%E8%BF%99%E7%AF%87%E6%96%87%E7%AB%A0%E4%BC%9A%E8%AE%B2%E8%BF%B0%E4%B8%80%E4%B8%AA%E6%8A%8ALinq%20to%20Object%E5%BA%94" title="Digg"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fusing-linq-to-object-in-testing%2F&amp;title=Linq%20to%20Object%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8&amp;notes=.NET%20Framework%203.5%E4%B8%AD%E5%BC%95%E5%85%A5%E4%BA%86%E4%B8%80%E4%B8%AA%E6%96%B0%E7%89%B9%E6%80%A7LINQ%EF%BC%88%E9%9B%86%E6%88%90%E8%AF%AD%E8%A8%80%E6%9F%A5%E8%AF%A2%EF%BC%89%EF%BC%8C%E6%8D%AE%E8%AF%B4.NET%20Framework%203.5%E4%B8%AD%E5%BE%88%E5%A4%9A%E7%89%B9%E6%80%A7%E9%83%BD%E6%98%AF%E4%B8%BALINQ%E8%80%8C%E6%9C%8D%E5%8A%A1%E7%9A%84%EF%BC%8C%E4%BE%8B%E5%A6%82Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E6%94%AF%E6%8C%81%EF%BC%8C%E5%8C%BF%E5%90%8D%E7%B1%BB%E5%9E%8B%EF%BC%8C%E7%AD%89%E7%AD%89%E2%80%A6%E2%80%A6%E8%BF%99%E7%AF%87%E6%96%87%E7%AB%A0%E4%BC%9A%E8%AE%B2%E8%BF%B0%E4%B8%80%E4%B8%AA%E6%8A%8ALinq%20to%20Object%E5%BA%94" title="del.icio.us"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fusing-linq-to-object-in-testing%2F&amp;t=Linq%20to%20Object%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8" title="Facebook"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fusing-linq-to-object-in-testing%2F&title=Linq%20to%20Object%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8" title="豆瓣"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban.png" title="豆瓣" alt="豆瓣" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fusing-linq-to-object-in-testing%2F&title=Linq%20to%20Object%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8&n=1" title="豆瓣九点"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban9.png" title="豆瓣九点" alt="豆瓣九点" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.friendfeed.com/share?title=Linq%20to%20Object%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fusing-linq-to-object-in-testing%2F" title="FriendFeed"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/friendfeed.png" title="FriendFeed" alt="FriendFeed" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fusing-linq-to-object-in-testing%2F&amp;title=Linq%20to%20Object%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8" title="Live"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://ping.fm/ref/?link=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fusing-linq-to-object-in-testing%2F&amp;title=Linq%20to%20Object%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8&amp;body=.NET%20Framework%203.5%E4%B8%AD%E5%BC%95%E5%85%A5%E4%BA%86%E4%B8%80%E4%B8%AA%E6%96%B0%E7%89%B9%E6%80%A7LINQ%EF%BC%88%E9%9B%86%E6%88%90%E8%AF%AD%E8%A8%80%E6%9F%A5%E8%AF%A2%EF%BC%89%EF%BC%8C%E6%8D%AE%E8%AF%B4.NET%20Framework%203.5%E4%B8%AD%E5%BE%88%E5%A4%9A%E7%89%B9%E6%80%A7%E9%83%BD%E6%98%AF%E4%B8%BALINQ%E8%80%8C%E6%9C%8D%E5%8A%A1%E7%9A%84%EF%BC%8C%E4%BE%8B%E5%A6%82Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E6%94%AF%E6%8C%81%EF%BC%8C%E5%8C%BF%E5%90%8D%E7%B1%BB%E5%9E%8B%EF%BC%8C%E7%AD%89%E7%AD%89%E2%80%A6%E2%80%A6%E8%BF%99%E7%AF%87%E6%96%87%E7%AB%A0%E4%BC%9A%E8%AE%B2%E8%BF%B0%E4%B8%80%E4%B8%AA%E6%8A%8ALinq%20to%20Object%E5%BA%94" title="Ping.fm"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/ping.png" title="Ping.fm" alt="Ping.fm" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://shuqian.qq.com/post?jumpback=1&title=Linq%20to%20Object%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fusing-linq-to-object-in-testing%2F" title="QQ书签"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/qq.png" title="QQ书签" alt="QQ书签" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://twitter.com/home?status=Linq%20to%20Object%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fwhiteboxtesting%2Fusing-linq-to-object-in-testing%2F" title="Twitter"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://magustest.com/blog/net/automatic-generate-xml-instance-by-using-xsd/' rel='bookmark' title='Permanent Link: 用XSD自动生成XML对应的.NET实体类'>用XSD自动生成XML对应的.NET实体类</a></li>
<li><a href='http://magustest.com/blog/whiteboxtesting/data-driven-test-in-unit-test/' rel='bookmark' title='Permanent Link: 在单元测试中应用数据驱动'>在单元测试中应用数据驱动</a></li>
<li><a href='http://magustest.com/blog/softwaretesting/using-httpcontext-in-unittest/' rel='bookmark' title='Permanent Link: 在C#单元测试中使用HttpContext的简单解决办法'>在C#单元测试中使用HttpContext的简单解决办法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/whiteboxtesting/using-linq-to-object-in-testing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LINQ查询操作中的类型关系</title>
		<link>http://magustest.com/blog/net/linq-type-convert/</link>
		<comments>http://magustest.com/blog/net/linq-type-convert/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 04:10:14 +0000</pubDate>
		<dc:creator>magus</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>

		<guid isPermaLink="false">http://magustest.com/blog/?p=333</guid>
		<description><![CDATA[最近在测试中，想尝试用LINQ来简化一下测试的代码，初步学习了一下LINQ，个人感觉需要认真理解查询操作中的类型关系，在阅读MSDN文档后写下了本文，主要参考MSDN讲述理解查询操作中的类型关系，还有对C# 3.0的一个新的关键字var的理解。 首先有一段LINQ查询表达式的代码 1 2 3 4 5 6 7 8 List&#60;onlineUser&#62; ret = AccountGateway.AccountLiteProvider.GetOnlineUsers&#40;1, 10000&#41;; var query = from onlineUser in ret where &#40;onlineUser.UserId &#62; 1301000200&#41; select onlineUser.UserId; foreach&#40;int iUser in query&#41; &#123; Console.WriteLine&#40;iUser.ToString&#40;&#41;&#41;; &#125; 这段代码首先查询出10000个在线用户，然后在这10000个在线用户中筛选出ID大于1301000200的用户ID。其中各个变量的类型如下： onlineUser &#8212; OnlineUser类 query &#8212; IEnumerable&#60;int&#62; iUser &#8212; int 下面可以看一下MSDN的详细说明： 数据源的类型参数决定范围变量的类型。 选择的对象的类型决定查询变量的类型。此处的 name 为一个字符串。因此，查询变量是一个 IEnumerable&#60;string&#62;。 在 foreach 语句中循环访问查询变量。因为查询变量是一个字符串序列，所以迭代变量也是一个字符串。 [...]


Related posts:<ol><li><a href='http://magustest.com/blog/softwaretesting/using-httpcontext-in-unittest/' rel='bookmark' title='Permanent Link: 在C#单元测试中使用HttpContext的简单解决办法'>在C#单元测试中使用HttpContext的简单解决办法</a></li>
<li><a href='http://magustest.com/blog/whiteboxtesting/using-linq-to-object-in-testing/' rel='bookmark' title='Permanent Link: Linq to Object在测试中的应用'>Linq to Object在测试中的应用</a></li>
<li><a href='http://magustest.com/blog/whiteboxtesting/data-driven-test-in-unit-test/' rel='bookmark' title='Permanent Link: 在单元测试中应用数据驱动'>在单元测试中应用数据驱动</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>最近在测试中，想尝试用LINQ来简化一下测试的代码，初步学习了一下LINQ，个人感觉需要认真理解查询操作中的类型关系，在阅读MSDN文档后写下了本文，主要参考MSDN讲述理解查询操作中的类型关系，还有对C# 3.0的一个新的关键字var的理解。</p>
<p>首先有一段LINQ查询表达式的代码</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">List<span style="color: #008000;">&lt;</span>onlineUser<span style="color: #008000;">&gt;</span> ret <span style="color: #008000;">=</span> AccountGateway.<span style="color: #0000FF;">AccountLiteProvider</span>.<span style="color: #0000FF;">GetOnlineUsers</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10000</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
var query <span style="color: #008000;">=</span> from onlineUser <span style="color: #0600FF;">in</span> ret
			where <span style="color: #000000;">&#40;</span>onlineUser.<span style="color: #0000FF;">UserId</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">1301000200</span><span style="color: #000000;">&#41;</span>
			select onlineUser.<span style="color: #0000FF;">UserId</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">foreach</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> iUser <span style="color: #0600FF;">in</span> query<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>iUser.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p><span id="more-333"></span><br />
这段代码首先查询出10000个在线用户，然后在这10000个在线用户中筛选出ID大于1301000200的用户ID。其中各个变量的类型如下：</p>
<ul>
<li>onlineUser &#8212;  OnlineUser类</li>
<li>query &#8212; IEnumerable&lt;int&gt;</li>
<li>iUser &#8212; int</li>
</ul>
<p>下面可以看一下MSDN的详细说明：</p>
<p><a href="http://magustest.com/blog/wp-content/uploads/2009/02/linq-ienumerable1.png"><img class="alignnone size-full wp-image-335" title="linq-IEnumerable" src="http://magustest.com/blog/wp-content/uploads/2009/02/linq-ienumerable1.png" alt="" width="403" height="228" /></a></p>
<ol>
<li>数据源的类型参数决定范围变量的类型。</li>
<li>选择的对象的类型决定查询变量的类型。此处的 <span class="code">name</span> 为一个字符串。因此，查询变量是一个  <strong>IEnumerable</strong>&lt;string&gt;。</li>
<li>在 <span class="keyword">foreach</span> 语句中循环访问查询变量。因为查询变量是一个字符串序列，所以迭代变量也是一个字符串。</li>
</ol>
<p>下面这个例子跟本文刚开始的代码例子相似</p>
<p><a href="http://magustest.com/blog/wp-content/uploads/2009/02/linq-data-conversion1.png"><img class="alignnone size-full wp-image-336" title="linq-data-conversion" src="http://magustest.com/blog/wp-content/uploads/2009/02/linq-data-conversion1.png" alt="" width="404" height="230" /></a></p>
<ol>
<li>数据源的类型参数决定范围变量的类型。</li>
<li><span class="keyword">select</span> 语句返回 <span class="code">Name</span> 属性，而非完整的  <span class="code">Customer</span> 对象。因为 <span class="code">Name</span> 是一个字符串，所以  <span class="code">custNameQuery</span> 的类型参数是 <span class="keyword">string</span>，而非 <span class="code">Customer</span>。</li>
<li>因为 <span class="code">custNameQuery</span> 是一个字符串序列，所以 <span class="keyword">foreach</span> 循环的迭代变量也必须是 <span class="keyword">string</span>。</li>
</ol>
<p>像上面这样做，有点不爽的就是每个变量类型都要编程的人来指定，C# 3.0还有一个新特性，就是隐式类型本地变量，也就是var关键字</p>
<p><a href="http://magustest.com/blog/wp-content/uploads/2009/02/linq-impl-var1.png"><img class="alignnone size-full wp-image-337" title="linq-impl-var" src="http://magustest.com/blog/wp-content/uploads/2009/02/linq-impl-var1.png" alt="" width="403" height="227" /></a></p>
<ol>
<li>数据源的类型参数始终为查询中的范围变量的类型。</li>
<li>因为 <span class="code">select</span> 语句生成匿名类型，所以必须使用 <span class="keyword">var</span> 隐式类型化查询变量。</li>
<li>因为查询变量的类型是隐式的，所以 <span class="keyword">foreach</span> 循环中的迭代变量也必须是隐式的。</li>
</ol>
<p>到此，对LINQ查询操作中的类型关系也比较明白了吧。</p>
<p>一个变量被var关键字声明为隐式类型本地变量后，它并不是一个动态变量，C#动态变量要等4.0的dynamic关键字。那么这个var是什么呢？其实var也是一个强类型变量，它的类型是在编译时就已经确定下来了，并不是运行时才确定下来的。例如：</p>
<p>var s = &#8220;I am a string&#8221;;   //s的类型是string</p>
<p>var i = 88;                    //i的类型是int</p>
<p>s = 99;                         //编译出错，不能把一个int赋值给string类型变量</p>
<p>用Reflector看编译后的代码就是这样子：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">List<span style="color: #008000;">&lt;</span>onlineUser<span style="color: #008000;">&gt;</span> ret <span style="color: #008000;">=</span> AccountGateway.<span style="color: #0000FF;">AccountLiteProvider</span>.<span style="color: #0000FF;">GetOnlineUsers</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10000</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
IEnumerable<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span> query <span style="color: #008000;">=</span> from onlineUser <span style="color: #0600FF;">in</span> ret
			where onlineUser.<span style="color: #0000FF;">UserId</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">1301000200</span>
			select onlineUser.<span style="color: #0000FF;">UserId</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> iUser <span style="color: #0600FF;">in</span> query<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>iUser.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>稍微总结一下var</p>
<ul>
<li>var还是强类型变量，不是弱类型变量</li>
<li>使用var不会带来性能损失，因为编译为IL以后，变量的类型已经是确定，不是在运行时通过反射获取类型。</li>
</ul>
<p>再最后，C#3.0, 3.5的很多新特性感觉都是为LINQ而出现的，例如：隐式类型化本地变量，匿名函数，匿名类，lambda表达式，扩展方法……</p>
<p>本文参考MSDN：http://msdn.microsoft.com/zh-cn/library/bb397924.aspx</p>



Share and Enjoy:


	<a rel="nofollow"  target="_blank" href="http://magustest.com/blog/feed/" title="RSS"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/rss.png" title="RSS" alt="RSS" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&amp;title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&amp;annotation=%E6%9C%80%E8%BF%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%EF%BC%8C%E6%83%B3%E5%B0%9D%E8%AF%95%E7%94%A8LINQ%E6%9D%A5%E7%AE%80%E5%8C%96%E4%B8%80%E4%B8%8B%E6%B5%8B%E8%AF%95%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%88%9D%E6%AD%A5%E5%AD%A6%E4%B9%A0%E4%BA%86%E4%B8%80%E4%B8%8BLINQ%EF%BC%8C%E4%B8%AA%E4%BA%BA%E6%84%9F%E8%A7%89%E9%9C%80%E8%A6%81%E8%AE%A4%E7%9C%9F%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB%EF%BC%8C%E5%9C%A8%E9%98%85%E8%AF%BBMSDN%E6%96%87%E6%A1%A3%E5%90%8E%E5%86%99%E4%B8%8B%E4%BA%86%E6%9C%AC%E6%96%87%EF%BC%8C%E4%B8%BB%E8%A6%81%E5%8F%82%E8%80%83MSDN%E8%AE%B2%E8%BF%B0%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB" title="Google Bookmarks"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/googlebookmark.png" title="Google Bookmarks" alt="Google Bookmarks" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&amp;title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&amp;bodytext=%E6%9C%80%E8%BF%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%EF%BC%8C%E6%83%B3%E5%B0%9D%E8%AF%95%E7%94%A8LINQ%E6%9D%A5%E7%AE%80%E5%8C%96%E4%B8%80%E4%B8%8B%E6%B5%8B%E8%AF%95%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%88%9D%E6%AD%A5%E5%AD%A6%E4%B9%A0%E4%BA%86%E4%B8%80%E4%B8%8BLINQ%EF%BC%8C%E4%B8%AA%E4%BA%BA%E6%84%9F%E8%A7%89%E9%9C%80%E8%A6%81%E8%AE%A4%E7%9C%9F%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB%EF%BC%8C%E5%9C%A8%E9%98%85%E8%AF%BBMSDN%E6%96%87%E6%A1%A3%E5%90%8E%E5%86%99%E4%B8%8B%E4%BA%86%E6%9C%AC%E6%96%87%EF%BC%8C%E4%B8%BB%E8%A6%81%E5%8F%82%E8%80%83MSDN%E8%AE%B2%E8%BF%B0%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB" title="Digg"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/digg.png" title="Digg" alt="Digg" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://delicious.com/post?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&amp;title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&amp;notes=%E6%9C%80%E8%BF%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%EF%BC%8C%E6%83%B3%E5%B0%9D%E8%AF%95%E7%94%A8LINQ%E6%9D%A5%E7%AE%80%E5%8C%96%E4%B8%80%E4%B8%8B%E6%B5%8B%E8%AF%95%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%88%9D%E6%AD%A5%E5%AD%A6%E4%B9%A0%E4%BA%86%E4%B8%80%E4%B8%8BLINQ%EF%BC%8C%E4%B8%AA%E4%BA%BA%E6%84%9F%E8%A7%89%E9%9C%80%E8%A6%81%E8%AE%A4%E7%9C%9F%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB%EF%BC%8C%E5%9C%A8%E9%98%85%E8%AF%BBMSDN%E6%96%87%E6%A1%A3%E5%90%8E%E5%86%99%E4%B8%8B%E4%BA%86%E6%9C%AC%E6%96%87%EF%BC%8C%E4%B8%BB%E8%A6%81%E5%8F%82%E8%80%83MSDN%E8%AE%B2%E8%BF%B0%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB" title="del.icio.us"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/delicious.png" title="del.icio.us" alt="del.icio.us" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.facebook.com/share.php?u=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&amp;t=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB" title="Facebook"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/facebook.png" title="Facebook" alt="Facebook" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB" title="豆瓣"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban.png" title="豆瓣" alt="豆瓣" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.douban.com/recommend/?url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&n=1" title="豆瓣九点"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/douban9.png" title="豆瓣九点" alt="豆瓣九点" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://www.friendfeed.com/share?title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&amp;link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F" title="FriendFeed"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/friendfeed.png" title="FriendFeed" alt="FriendFeed" class="sociable-hovers" /></a>
	<img src="http://magustest.com/blog/wp-content/plugins/sociable/images/linkedin.png" title="LinkedIn" alt="LinkedIn" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;url=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&amp;title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB" title="Live"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/live.png" title="Live" alt="Live" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://ping.fm/ref/?link=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F&amp;title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&amp;body=%E6%9C%80%E8%BF%91%E5%9C%A8%E6%B5%8B%E8%AF%95%E4%B8%AD%EF%BC%8C%E6%83%B3%E5%B0%9D%E8%AF%95%E7%94%A8LINQ%E6%9D%A5%E7%AE%80%E5%8C%96%E4%B8%80%E4%B8%8B%E6%B5%8B%E8%AF%95%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%88%9D%E6%AD%A5%E5%AD%A6%E4%B9%A0%E4%BA%86%E4%B8%80%E4%B8%8BLINQ%EF%BC%8C%E4%B8%AA%E4%BA%BA%E6%84%9F%E8%A7%89%E9%9C%80%E8%A6%81%E8%AE%A4%E7%9C%9F%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB%EF%BC%8C%E5%9C%A8%E9%98%85%E8%AF%BBMSDN%E6%96%87%E6%A1%A3%E5%90%8E%E5%86%99%E4%B8%8B%E4%BA%86%E6%9C%AC%E6%96%87%EF%BC%8C%E4%B8%BB%E8%A6%81%E5%8F%82%E8%80%83MSDN%E8%AE%B2%E8%BF%B0%E7%90%86%E8%A7%A3%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB" title="Ping.fm"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/ping.png" title="Ping.fm" alt="Ping.fm" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://shuqian.qq.com/post?jumpback=1&title=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB&uri=http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F" title="QQ书签"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/qq.png" title="QQ书签" alt="QQ书签" class="sociable-hovers" /></a>
	<a rel="nofollow"  target="_blank" href="http://twitter.com/home?status=LINQ%E6%9F%A5%E8%AF%A2%E6%93%8D%E4%BD%9C%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E5%85%B3%E7%B3%BB%20-%20http%3A%2F%2Fmagustest.com%2Fblog%2Fnet%2Flinq-type-convert%2F" title="Twitter"><img src="http://magustest.com/blog/wp-content/plugins/sociable/images/twitter.png" title="Twitter" alt="Twitter" class="sociable-hovers" /></a>


<br/><br/>

<p>Related posts:<ol><li><a href='http://magustest.com/blog/softwaretesting/using-httpcontext-in-unittest/' rel='bookmark' title='Permanent Link: 在C#单元测试中使用HttpContext的简单解决办法'>在C#单元测试中使用HttpContext的简单解决办法</a></li>
<li><a href='http://magustest.com/blog/whiteboxtesting/using-linq-to-object-in-testing/' rel='bookmark' title='Permanent Link: Linq to Object在测试中的应用'>Linq to Object在测试中的应用</a></li>
<li><a href='http://magustest.com/blog/whiteboxtesting/data-driven-test-in-unit-test/' rel='bookmark' title='Permanent Link: 在单元测试中应用数据驱动'>在单元测试中应用数据驱动</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://magustest.com/blog/net/linq-type-convert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
