您的位置:首页 > 其它

LINQ(三)使用 LINQ 进行数据转换

2014-10-18 18:05 281 查看

本文内容包括:将多个输入联接到一个输出序列;选择各个源元素的子集组成新对象;将内存中的对象转换为XML;对源元素执行操作即进行运算后返回新对象。

将多个输入联接到一个输出序列

可以使用LINQ查询来创建包含多个输入序列的元素的输出序列。下面的示例演示如何组合两个内存中的数据结构,但组合来自XML
或SQL或数据集源的数据时可应用相同的原则。假定下面两种类类型:

C#


classStudent

{

publicstringFirst{get;set;}

publicstringLast{get;set;}

publicintID{get;set;}

publicstringStreet{get;set;}

publicstringCity{get;set;}

publicList<int>Scores;

}


classTeacher

{

publicstringFirst{get;set;}

publicstringLast{get;set;}

publicintID{get;set;}

publicstringCity{get;set;}

}



下面的示例演示该查询:

C#


classDataTransformations

{

staticvoidMain()

{

//Createthefirstdatasource.

List<Student>students=newList<Student>()

{

newStudent{First="Svetlana",

Last="Omelchenko",

ID=111,

Street="123MainStreet",

City="Seattle",

Scores=newList<int>{97,92,81,60}},

newStudent{First="Claire",

Last="O’Donnell",

ID=112,

Street="124MainStreet",

City="Redmond",

Scores=newList<int>{75,84,91,39}},

newStudent{First="Sven",

Last="Mortensen",

ID=113,

Street="125MainStreet",

City="LakeCity",

Scores=newList<int>{88,94,65,91}},

};


//Createtheseconddatasource.

List<Teacher>teachers=newList<Teacher>()

{

newTeacher{First="Ann",Last="Beebe",ID=945,City="Seattle"},

newTeacher{First="Alex",Last="Robinson",ID=956,City="Redmond"},

newTeacher{First="Michiyo",Last="Sato",ID=972,City="Tacoma"}

};


//Createthequery.

varpeopleInSeattle=(fromstudentinstudents

wherestudent.City=="Seattle"

selectstudent.Last)

.Concat(fromteacherinteachers

whereteacher.City=="Seattle"

selectteacher.Last);


Console.WriteLine("ThefollowingstudentsandteachersliveinSeattle:");

//Executethequery.

foreach(varpersoninpeopleInSeattle)

{

Console.WriteLine(person);

}


Console.WriteLine("Pressanykeytoexit.");

Console.ReadKey();

}

}

/*Output:

ThefollowingstudentsandteachersliveinSeattle:

Omelchenko

Beebe

*/



选择各个源元素的子集||合并

选择源序列中的各个元素的子集有两种主要方法:

1.若要只选择源元素的一个成员,请使用点运算。在下面的示例中,假定Customer对象包含几个公共属性,其中包括名为City的字符串。在执行此查询时,此查询将生成字符串输出序列。

2.varquery=fromcustinCustomers

3.selectcust.City;

4.若要创建包含源元素的多个属性的元素,可以使用具有命名对象或匿名类型的对象初始值设定项。下面的示例演示如何使用匿名类型来封装各个Customer元素的两个属性:

5.varquery=fromcustinCustomer

selectnew{Name=cust.Name,City=cust.City};



将内存中的对象转换为XML

通过LINQ查询,可以轻松地在内存中的数据结构、SQL
数据库、ADO.NET数据集和XML流或文档之间转换数据。下面的示例将内存中的数据结构中的对象转换为XML
元素。

C#


classXMLTransform

{

staticvoidMain()

{

//Createthedatasourcebyusingacollectioninitializer.

//TheStudentclasswasdefinedpreviouslyinthistopic.

List<Student>students=newList<Student>()

{

newStudent{First="Svetlana",Last="Omelchenko",ID=111,Scores=newList<int>{97,92,81,60}},

newStudent{First="Claire",Last="O’Donnell",ID=112,Scores=newList<int>{75,84,91,39}},

newStudent{First="Sven",Last="Mortensen",ID=113,Scores=newList<int>{88,94,65,91}},

};


//Createthequery.

varstudentsToXML=newXElement("Root",

fromstudentinstudents

letx=String.Format("{0},{1},{2},{3}",student.Scores[0],

student.Scores[1],student.Scores[2],student.Scores[3])

selectnewXElement("student",

newXElement("First",student.First),

newXElement("Last",student.Last),

newXElement("Scores",x)

)//end"student"

);//end"Root"


//Executethequery.

Console.WriteLine(studentsToXML);


//Keeptheconsoleopenindebugmode.

Console.WriteLine("Pressanykeytoexit.");

Console.ReadKey();

}

}



此代码生成下面的XML输出:

<Root>

<student>

<First>Svetlana</First>

<Last>Omelchenko</Last>

<Scores>97,92,81,60</Scores>

</student>

<student>

<First>Claire</First>

<Last>O'Donnell</Last>

<Scores>75,84,91,39</Scores>

</student>

<student>

<First>Sven</First>

<Last>Mortensen</Last>

<Scores>88,94,65,91</Scores>

</student>

</Root>





对源元素执行操作

输出序列可能不包含源序列的任何元素或元素属性。输出可能是通过将源元素用作输入参数计算出的值的序列。在执行下面这个简单查询时,此查询会输出一个字符串序列,该序列值表示根据double类型的元素的源序列进行的计算。

说明

如果查询将转换为某个其他域,则不支持在查询表达式中调用方法。例如,不能在LINQtoSQL
中调用一般C#方法,因为SQLServer没有该方法的上下文。但是,可以将存储过程映射到方法,然后调用方法。有关更多信息,请参见存储过程
[LINQtoSQL]。

C#


classFormatQuery

{

staticvoidMain()

{

//Datasource.

double[]radii={1,2,3};


//Query.

IEnumerable<string>query=

fromradinradii

selectString.Format("Area={0}",(rad*rad)*3.14);


//Queryexecution.

foreach(stringsinquery)

Console.WriteLine(s);


//Keeptheconsoleopenindebugmode.

Console.WriteLine("Pressanykeytoexit.");

Console.ReadKey();

}

}

/*Output:

Area=3.14

Area=12.56

Area=28.26

*/


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: