c# - LINQ:为什么我不能在返回的对象中声明新对象?

标签 c# linq entity-framework-4 properties

首先,我做了一些搜索来寻找这个问题的答案......但我找不到任何东西,因为我不知道我正在使用的功能叫什么。

下面代码中的 DBEntities 是由 devart 为 Oracle DB 连接生成的。

为什么第一个示例有效,而第二个示例只给我一个 System.NullReferenceException?

有效代码:

using (DBEntities context = new DBEntities())
{
    var infos = (from info in context.Infos
                 where info.Index == index
                 orderby info.Name
                 select new
                 {
                     Name = info.Name,
                     MRN = info.MRN,
                     UnitNumber = (info.UnitNum == null) ? -1 : (decimal)info.UnitNum,
                     UnitName = (info.UnitName == null) ? String.Empty : info.UnitName
                 }).Distinct();

    foreach (var info in infos)
    {
        // *do stuff*
    }
}

给出异常的代码(只有在到达 foreach 时才会出现异常):

using (DBEntities context = new DBEntities())
{
    var infos = (from info in context.Infos
                 where info.Index == index
                 orderby info.Name
                 select new Member()
                 {
                     Name = info.Name,
                     MRN = info.MRN,
                     CurrentUnit = new Unit()
                     {
                         UnitNumber = (info.UnitNum == null) ? -1 : (decimal)info.UnitNum,
                         UnitName = (info.UnitName == null) ? String.Empty : info.UnitName
                     }
                 }).Distinct();

    foreach (Member info in infos)
    {
        // *do stuff*
    }
}

编辑: 我想补充一点,这也有效:

using (DBEntities context = new DBEntities())
{
    var infos = (from info in context.Infos
                 where info.Index == index
                 orderby info.Name
                 select new Member()
                 {
                     Name = info.Name,
                     MRN = info.MRN
                 }).Distinct();

    foreach (Member info in infos) //Exception is thrown here.
    {
        // *do stuff*
    }
}

最佳答案

第一个可行,因为您可以从 SQL 返回这些匿名类型,并且 EF 可以为整个表达式生成 SQL 语句。第二个则不然,因为您无法在 SQL 中创建 Member 类的实例。如果您强制进行枚举(使用 AsEnumerable()),您可以在客户端创建 Member 值。

异常总是会在枚举时抛出,因为 LINQ 在设计上是完全“惰性”的。如果您想在创建表达式时强制执行此操作(例如出于测试目的),请将 .ToList() 添加到其末尾。

关于c# - LINQ:为什么我不能在返回的对象中声明新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049869/

相关文章:

sql - 我应该在什么情况下使用 Entity SQL?

c# - 使 SQL Server 中的正则表达式搜索更高效

c# - 将 Func<T, string>[] 转换成 Func<T, string[]>?

asp.net-mvc-3 - 注册后根据角色重定向

.net - 如何使用 LINQ to XML 读取/写入加密的 XML 文件?

c# - select new 中的 Linq where 子句

c# - 预编译 View 不影响性能

c# - Service Fabric Actor 服务依赖注入(inject)和 Actor 事件

c# - Entity Framework - 在分离状态下保存对相关对象的更改

c# - 如何检查Azure函数是否在本地环境中运行? `RoleEnvironment` 无法在 Azure Functions 中运行