什么是LINQ中的投影,如.Select()

时间:2014-04-23 18:05:29

标签: linq projection

我通常会进行移动应用开发,但并不总是这样。选择。但是,我已经看过这个用了一点,但我真的不知道它做了什么或者它做了什么。这就像

    from a in list select a // a.Property // new Thing { a.Property}

我问,因为当我看到使用.Select()的代码时,我对它的工作感到有点困惑。

3 个答案:

答案 0 :(得分:26)

.Select()来自LINQ的方法语法,代码select中的from a in list select a用于查询语法。两者都相同,查询语法编译成方法语法。

您可能会看到:Query Syntax and Method Syntax in LINQ (C#)

<强>投影

Projection Operations - MSDN

  

投影是指将对象转换为对象的操作   新表单通常只包含那些属性   随后使用。通过使用投影,您可以构造一个新类型   这是从每个对象构建的。您可以投影属性并执行   一个数学函数。您也可以投影原件   对象没有改变它。

您可能还会看到: LINQ Projection

  

调用转换查询结果的过程   投影。您可以在任何过滤器之后投影查询结果   已被应用于更改集合的类型   返回。

Example from MSDN

List<string> words = new List<string>() { "an", "apple", "a", "day" };
var query = from word in words
            select word.Substring(0, 1);

在上面的示例中,仅选择/投影每个字符串实例的第一个字符。

您还可以从集合中选择一些字段并创建anonymous type或现有类的实例,该过程称为投影。

from a in list select new { ID = a.Id}

在上面的代码字段中,Id被投射到一个匿名类型,忽略其他字段。请考虑您的列表中有MyClass类型的对象,其定义如下:

class MyClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
}

现在,您可以将IdName投影到匿名类型,例如:

查询语法:

var result = from a in list
             select new
                 {
                     ID = a.Id,
                     Name = a.Name,
                 };

方法语法

var result = list.Select(r => new { ID = r.Id, Name = r.Name });

您还可以将结果投影到新类。考虑你有一个类:

    class TemporaryHolderClass
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

然后你可以这样做:

查询语法:

 var result = from a in list
             select new TemporaryHolderClass
                 {
                     Id = a.Id,
                     Name = a.Name,
                 };

方法语法:

var result = list.Select(r => new TemporaryHolderClass  
                            { 
                                Id = r.Id, 
                                Name = r.Name 
                            });

如果您没有尝试投影到为LINQ to SQL或Entity Framework生成/创建的类,也可以投影到同一个类。

答案 1 :(得分:1)

我的摘要是它需要结果(或结果的子集),并允许您快速重组它以在本地环境中使用。

  

select子句生成查询结果并指定   “形状”或每个返回元素的类型。例如,您可以指定   您的结果是否仅包含完整的Customer对象   一个成员,一个成员的子集,或一些完全不同的结果   基于计算或新对象创建的类型。

来源:http://msdn.microsoft.com/en-us/library/bb397927.aspx

有很多可能的用途,但其中一个是使用一个复杂的对象,其中许多其他包含一个字符串的属性 - 比如说Name - 并且允许你只返回枚举Name的条目。我相信你也可以做相反的事情 - 使用该属性(例如)并在传入属性时创建/返回新类型的对象。

答案 2 :(得分:0)

表示“映射”。将序列的每个元素映射到转换后的序列。在查看图像之前,我还没有理解它的含义。

这个词的含义从哪里来?

简单地说,数学! https://mathworld.wolfram.com/Projection.html

enter image description here