select r.Field和select new {r.Field}之间的区别

时间:2012-07-17 10:15:58

标签: c# linq entity-framework linq-to-sql c#-4.0

链接到这两个主题:

Convert Lambda Expression of a query to linq version

return items that all records related to that items have specific conditions

在第一个主题@xanatos中评论:

  

@Kerezo请注意,新的{r.City}错误会出现两次(每次查询一次)。 new {r.City}创建一个匿名对象,其中包含一个名为City的属性,其中包含City对象(因此您将City包装在一个对象中)如果没有新的,您可以直接使用City

考虑这段代码:

var citiesToExclude = from r in ent.TestAllStatusEqualsOnes
                              where r.Status != 1
                              select r.City;

GridView1.DataSource = citiesToExclude;
GridView1.DataBind();

如果我以这种方式编写此代码:

var citiesToExclude = from r in ent.TestAllStatusEqualsOnes
                              where r.Status != 1
                              select new { r.City };

GridView1.DataSource = citiesToExclude;
GridView1.DataBind();

每件事都是平等的。

我不明白select r.Fieldselect new {r.Field}之间的区别是什么。谁可以解释更多?

感谢

3 个答案:

答案 0 :(得分:3)

匿名类型几乎与任何其他类型相同。所以:

select new { r.City }

几乎完全相同:

select new SomeType { City = r.City}

使用:

class SomeType { public string City {get;set;} }

然后,这可能使区分变得简单;它与以下区别相同:

string x = obj.City;

SomeType y = new SomeType { City = obj.City };

在一个案例中,您获得的是城市名称。在另一种情况下,您将获得一个具有属性的对象,该属性名为City,其中城市名称(尽管在一般情况下,它可以具有其他属性也是如此。

LINQ中也适用相同的逻辑。

两者之间的一个方便的区别是考虑null,例如:

var city = {some query}.FirstOrDefault();

如果您选择实际的城市名称,则很难区分“无行”与“行,城市名称为空”之间的区别。如果您选择对象,则可以在obj == nullobj.City == null之间进行判断。

答案 1 :(得分:2)

1 - 选择r.Field - 返回现有类型(例如,r.Field = string)

2 - select new {r.Field} - 返回新的匿名类型对象。

希望它能够消除疑虑。

答案 2 :(得分:2)

new { Property = value }语法用于创建Anonymous Types(具有只读属性的引用类型以及对相等性和类型重用的支持)。

区别在于您的第一个语句返回IEnumerable<City Type>,第二个语句返回IEnumerable<anonymous type>。匿名类型具有City类型City Type的属性。如果未在以下位置指定属性名称:

new { City = r.City }; // Explicitly-named property called City.

匿名类型采用在:

中使用的属性的名称
new { r.City }; // Property called City.

如果匿名类型无法解析名称:

new { "a string" };

您收到编译错误。

匿名类型对于构建用于传播到另一个扩展方法或linq语句的另一部分的内联容器非常有用。

匿名类型不能声明为类成员,您需要使用var来充分利用它们。有IntelliSense支持。它们也不满足接口定义,只能包含属性。