链接到这两个主题:
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.Field
和select new {r.Field}
之间的区别是什么。谁可以解释更多?
感谢
答案 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 == null
与obj.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支持。它们也不满足接口定义,只能包含属性。