具有匿名类型和用户定义类型的 LINQ select 查询
LINQ select query with Anonymous type and user Defined type
Anonymous class 在 c# 中具有只读属性。这通常用于在 linq select 查询中声明以从数据库中获取特定值。
在我的代码中,我有以下 query.The 让我感到困惑的事情 select 使用 new 语句 classing 匿名的新对象。我有一个 class 的 StudentClerkshipsLogModel
模型。当我使用模型名称时,查询结果允许编辑。
var query = (from entity in _tblStudentClerkshipsLog.GetQueryable()
where entity.StudentID == intStudentID
select new StudentClerkshipsLogModel
{
StudentClerkshipID = entity.StudentClerkshipID,
StudentID = entity.StudentID,
ClerkshipID = entity.ClerkshipID,
}).ToList();
当我在 select
语句中的 new
之后没有提到类型时,我无法退出。编译器引发错误。匿名对象是只读的。
var query = (from entity in _tblStudentClerkshipsLog.GetQueryable()
where entity.StudentID == intStudentID
select new
{
StudentClerkshipID = entity.StudentClerkshipID,
StudentID = entity.StudentID,
ClerkshipID = entity.ClerkshipID,
}).ToList()
我的问题是 linq 如何以不同方式绑定大约两个查询。两个查询都有动态绑定,或者第一个是静态的。
谢谢
您遇到的错误实际上与 LINQ 没有任何关系。完全不使用 LINQ 也能看到同样的结果:
var anonymous = new { Name = "Fred" };
anonymous.Name = "Joe"; // Error, as properties of anonymous types are read-only
因此,如果您想修改 LINQ 查询获取的对象,则不应使用匿名类型。但是这两个 LINQ 查询都是静态绑定的——匿名类型在编译时仍然是完全已知的,并且编译器对它们应用正常的类型限制。例如:
var anonymous = new { Name = "Fred" };
Console.WriteLine(anonymous.Foo); // Error: no property Foo
int bar = anonymous.Name; // Error: no conversion from string to int
如果我理解正确,你想知道 LINQ 提供程序如何设置匿名对象的属性,因为它们是 "true" 只读属性(没有任何 private set
,但是 [=仅 14=])?
当您为 IQueryable<T>
调用 Select
扩展方法时,它接受 表达式 类型 Expression<Func<T, TResult>
。如果您要为 Select
编写一些存根,您可以使用调试器查看生成的表达式:
public static class MyExtensions
{
public static void MySelect<T, TResult>(this IQueryable<T> query, Expression<Func<T, TResult>> projection)
{
System.Diagnostics.Debug.WriteLine(projection);
}
}
不同之处在于编译器如何为命名类型和匿名类型生成 lambda 表达式。当您为命名类型调用 Select
时,表达式将如下所示:
{_ => new Person() {Id = _.Id, Name = _.Name}}
即先构造新的Person
对象,然后初始化成员(MemberInit
表达式)。
但是当你为匿名类型调用 Select
时,表达式将被构建为构造函数调用(New
表达式):
{_ => new <>f__AnonymousType0`2(a = _.Id, b = _.Name)}
LINQ 提供程序将这些 lambda 编译成委托,当具体化查询结果时,最终只调用匿名类型的构造函数。
我发现 LINQ 结果的匿名类型结果存在以下差异。
结果不可编辑,例如如果我们给 gridview 赋值
将是只读的。
匿名范围问题 object.we 无法传递类型
到另一种方法。定义一个var类型的参数; var 必须总是
后跟一个初始化表达式。
如果您只需要当前上下文中的结果用于只读目的,请使用匿名查询。如果您需要其他功能的结果,则必须定义对象类型。 new
之后的对象类型将使用您想要从结果定义中获取的属性创建,然后在花括号中定义 {}
。
没有必要初始化模型的所有值 class.
Anonymous class 在 c# 中具有只读属性。这通常用于在 linq select 查询中声明以从数据库中获取特定值。
在我的代码中,我有以下 query.The 让我感到困惑的事情 select 使用 new 语句 classing 匿名的新对象。我有一个 class 的 StudentClerkshipsLogModel
模型。当我使用模型名称时,查询结果允许编辑。
var query = (from entity in _tblStudentClerkshipsLog.GetQueryable()
where entity.StudentID == intStudentID
select new StudentClerkshipsLogModel
{
StudentClerkshipID = entity.StudentClerkshipID,
StudentID = entity.StudentID,
ClerkshipID = entity.ClerkshipID,
}).ToList();
当我在 select
语句中的 new
之后没有提到类型时,我无法退出。编译器引发错误。匿名对象是只读的。
var query = (from entity in _tblStudentClerkshipsLog.GetQueryable()
where entity.StudentID == intStudentID
select new
{
StudentClerkshipID = entity.StudentClerkshipID,
StudentID = entity.StudentID,
ClerkshipID = entity.ClerkshipID,
}).ToList()
我的问题是 linq 如何以不同方式绑定大约两个查询。两个查询都有动态绑定,或者第一个是静态的。
谢谢
您遇到的错误实际上与 LINQ 没有任何关系。完全不使用 LINQ 也能看到同样的结果:
var anonymous = new { Name = "Fred" };
anonymous.Name = "Joe"; // Error, as properties of anonymous types are read-only
因此,如果您想修改 LINQ 查询获取的对象,则不应使用匿名类型。但是这两个 LINQ 查询都是静态绑定的——匿名类型在编译时仍然是完全已知的,并且编译器对它们应用正常的类型限制。例如:
var anonymous = new { Name = "Fred" };
Console.WriteLine(anonymous.Foo); // Error: no property Foo
int bar = anonymous.Name; // Error: no conversion from string to int
如果我理解正确,你想知道 LINQ 提供程序如何设置匿名对象的属性,因为它们是 "true" 只读属性(没有任何 private set
,但是 [=仅 14=])?
当您为 IQueryable<T>
调用 Select
扩展方法时,它接受 表达式 类型 Expression<Func<T, TResult>
。如果您要为 Select
编写一些存根,您可以使用调试器查看生成的表达式:
public static class MyExtensions
{
public static void MySelect<T, TResult>(this IQueryable<T> query, Expression<Func<T, TResult>> projection)
{
System.Diagnostics.Debug.WriteLine(projection);
}
}
不同之处在于编译器如何为命名类型和匿名类型生成 lambda 表达式。当您为命名类型调用 Select
时,表达式将如下所示:
{_ => new Person() {Id = _.Id, Name = _.Name}}
即先构造新的Person
对象,然后初始化成员(MemberInit
表达式)。
但是当你为匿名类型调用 Select
时,表达式将被构建为构造函数调用(New
表达式):
{_ => new <>f__AnonymousType0`2(a = _.Id, b = _.Name)}
LINQ 提供程序将这些 lambda 编译成委托,当具体化查询结果时,最终只调用匿名类型的构造函数。
我发现 LINQ 结果的匿名类型结果存在以下差异。
结果不可编辑,例如如果我们给 gridview 赋值 将是只读的。
匿名范围问题 object.we 无法传递类型 到另一种方法。定义一个var类型的参数; var 必须总是 后跟一个初始化表达式。
如果您只需要当前上下文中的结果用于只读目的,请使用匿名查询。如果您需要其他功能的结果,则必须定义对象类型。 new
之后的对象类型将使用您想要从结果定义中获取的属性创建,然后在花括号中定义 {}
。
没有必要初始化模型的所有值 class.