使用 LINQ 进行数据转换
语言集成查询 (LINQ) 不仅可用于检索数据 而且还是一个功能强大的数据转换工具 通过使用 LINQ 查询您可以将源序列用作输入并采用多种方式修改它以创建新输出序列 您可以通过排序和分组来修改序列本身而不必修改元素本身但是LINQ 查询的最强大功能可能在于它能够创建新类型 这一功能在 select 子句中实现 例如可以执行下列任务
将多个输入序列合并到具有新类型的单个输出序列中
创建其元素只包含源序列中的各个元素的一个或几个属性的输出序列
创建其元素包含对源数据执行的操作结果的输出序列
创建不同格式的输出序列
将多个输入联接到一个输出序列
可以使用 LINQ 查询来创建包含多个输入序列的元素的输出序列下面的示例演示如何组合两个内存中的数据结构但组合来自 XML 或 SQL 或数据集源的数据时可应用相同的原则
class Student{ public string First { get; set; } public string Last {get; set;} public int ID { get; set; } public string Street { get; set; } public string City { get; set; } public List<int> Scores;}class Teacher{ public string First { get; set; } public string Last { get; set; } public int ID { get; set; } public string City { get; set; }}
class DataTransformations{ static void Main() { List<Student> students = new List<Student>() { new Student {First=Svetlana Last=Omelchenko ID= Street= Main Street City=Seattle Scores= new List<int> { }} new Student {First=Claire Last=ODonnell ID= Street= Main Street City=Redmond Scores= new List<int> { }} new Student {First=Sven Last=Mortensen ID= Street= Main Street City=Lake City Scores= new List<int> { }} }; List<Teacher> teachers = new List<Teacher>() { new Teacher {First=Ann Last=Beebe ID= City = Seattle} new Teacher {First=Alex Last=Robinson ID= City = Redmond} new Teacher {First=Michiyo Last=Sato ID= City = Tacoma} }; var peopleInSeattle = (from student in students where studentCity == Seattle select studentLast) Concat(from teacher in teachers where teacherCity == Seattle select teacherLast); ConsoleWriteLine(The following students and teachers live in Seattle:); foreach (var person in peopleInSeattle) { ConsoleWriteLine(person); } ConsoleWriteLine(Press any key to exit); ConsoleReadKey(); }}
选择各个源元素的子集
若要只选择源元素的一个成员请使用点运算在下面的示例中假定 Customer 对象包含几个公共属性其中包括名为 City 的字符串在执行此查询时此查询将生成字符串输出序列
var query = from cust in Customers select custCity;
若要创建包含源元素的多个属性的元素可以使用具有命名对象或匿名类型的对象初始值设定项
var query = from cust in Customer select new {Name = custName City = custCity};
将内存中的对象转换为 XML
通过 LINQ 查询可以轻松地在内存中的数据结构SQL 数据库ADONET 数据集和 XML 流或文档之间转换数据
class XMLTransform{ static void Main() { List<Student> students = new List<Student>() { new Student {First=Svetlana Last=Omelchenko ID= Scores = new List<int>{ }} new Student {First=Claire Last=ODonnell ID= Scores = new List<int>{ }} new Student {First=Sven Last=Mortensen ID= Scores = new List<int>{ }} }; var studentsToXML = new XElement(Root from student in students let x = StringFormat({}{}{}{} studentScores[] studentScores[] studentScores[] studentScores[]) select new XElement(student new XElement(First studentFirst) new XElement(Last studentLast) new XElement(Scores x) ) ); ConsoleWriteLine(studentsToXML); ConsoleWriteLine(Press any key to exit); ConsoleReadKey(); }}
对源元素执行操作
输出序列可能不包含源序列的任何元素或元素属性输出可能是通过将源元素用作输入参数计算出的值的序列在执行下面这个简单查询时此查询会输出一个字符串序列该序列值表示根据 double 类型的元素的源序列进行的计算
class FormatQuery{ static void Main() { double[] radii = { }; IEnumerable<string> query = from rad in radii select StringFormat(Area = {} (rad * rad) * ); foreach (string s in query) ConsoleWriteLine(s); ConsoleWriteLine(Press any key to exit); ConsoleReadKey(); }}