LINQ C#查询的逻辑是什么?

时间:2012-07-09 02:40:13

标签: c# linq

从“Essential LINQ”一书中查看以下程序:

class Customer
    {
     public string CustomerID {get;set;}
     public string ContactName {get;set;}
     public string City {get;set;}
     public static List<Customer> GetCustomers()
     {
        return new List<Customer>
        {
            new Customer {CustomerID = "ALFKI", ContactName = "Maria Anders", City = "Berlin"},
            new Customer {CustomerID = "ANATR", ContactName = "Sns Trujillo", City = "Mexico D.F."},
            new Customer {CustomerID = "ANTON", ContactName = "Antonio Moreno", City = "Mexico D.F."}
        };
     }
    }
void Main()
{
    var query = from c in Customer.GetCustomers()
                where c.City == "Mexico D.F."
                select new { c.City,  c.ContactName};
    foreach (var cityandcontact in query)
    {
        Console.WriteLine(cityandcontact);
    }
}

在LINQ查询中,如果我从行中删除“new”,为什么它会给我错误:
select new {c.City, c.ContactName};

为什么我们不能像这样写

select c.City, c.ContactName;

这里的逻辑是什么?

6 个答案:

答案 0 :(得分:4)

查询返回同一类对象的枚举。它可以是任何类,但它必须只是所有行的一个。如果不将对象(城市和联系人姓名)组合成单个对象,则无法返回这些对象。在这种情况下,您将它们组合成一个匿名类型的对象,具有两个属性。

另外,使用Select方法没有任何优势,因为这两个属性都来自同一个Customer类。实际上,返回客户对象的效率低于此:

var query = from c in Customer.GetCustomers()
            where c.City == "Mexico D.F.";
foreach (var c in query)
{
    Console.WriteLine("{0} {1}", c.City, c.ContactName);
}

答案 1 :(得分:1)

LINQ方法与其他C#方法一样,只能返回一个值/对象。 (对于所述假设构造,没有添加语法支持来神奇地执行new { .. }内容所做的事情。)

这就是为什么不同的领域是&#34;包装&#34;在一个新对象中:它是一个单个值/对象,其中成员代表所有选定的字段。

(同样,最终结果IEnumerable<..>也只是一个值/对象,序列中包含0个或更多元素:在这种情况下,每个元素都是一个新对象创建的上面有new { .. }。)

答案 2 :(得分:0)

new { c.City, c.ContactName};是匿名类型的C#语法。

答案 3 :(得分:0)

'select'选择一个Customer类,它由City变量和ContactNamr变量组成。因此,您必须为select提供带有这些变量的新类

答案 4 :(得分:0)

这不是SQL这是linq,语法基本上就是你看到的。

select new { c.City,  c.ContactName};

将查询的输出限制为仅包含City和ContactName的类型。

你可能会问这是什么类型的?好吧,它是编译器为您创建的anonymous type

然后代码迭代查询结果(IEnumerable<this_new_type>)并写入这种新类型的ToString()。

答案 5 :(得分:0)

选择正在创建新的anonymous object

“匿名类型提供了一种方便的方法,可以将一组只读属性封装到单个对象中,而无需先显式定义类型”

select new {c.City, c.ContactName};

您还可以创建一个要投影的具体类。

即一个名为 Blah 的课程:

class Blah
{
  public string City {get;set;}
  public string ContactName {get;set;}
}

... [rest of query]
select new Blah {c.City, c.ContactName};

你不能去“select c.City,c.ContactName;”的原因是因为语言语法并不是为处理它而设计的。