从“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;
这里的逻辑是什么?
答案 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;”的原因是因为语言语法并不是为处理它而设计的。