我收到以下错误:
LINQ to Entities 仅支持无参数构造函数和初始值设定项。
我试图从结果集中查询数据,新结果集的一部分返回一个新的日期字段。
var result = debts.Select(x => new
{
x.Snowball.User.Email,
x.SnowballID,
x.Description,
x.ID,
x.DueDayOfMonth,
Due = new DateTime(ExecutionDate.Year,
ExecutionDate.Month,
x.DueDayOfMonth)
}).ToList();
Run Code Online (Sandbox Code Playgroud)
有没有办法可以创建这个推断的日期时间?
我来到这里寻找同样的东西,但在进一步的研究中发现了另一种在 System.Data.Entity 中使用 DbFunctions.CreateDateTime 的方法。使用此方法,您的查询将如下所示:
var result = debts.Select(x => new
{
x.Snowball.User.Email,
x.SnowballID,
x.Description,
x.ID,
x.DueDayOfMonth,
Due = DbFunctions.CreateDateTime(ExecutionDate.Year,
ExecutionDate.Month,
x.DueDayOfMonth, 0,0,0)
}).ToList();
Run Code Online (Sandbox Code Playgroud)
EDIT: This is for EF6 and later, for earlier versions of EF use System.Data.Entity.Core.Objects.EntityFunctions instead of DbFunctions
LINQ to Entities 有一个查询边界。
如果您愿意,IQueryable 结果允许逐步添加一个或多个过滤器和选择等。
当查询被添加到数据库中时,还没有任何内容;仅当您访问结果集时,LINQ 提供程序才会构造查询(例如单个 Transact SQL 查询),然后在数据库上运行并返回其结果。
Date在您所展示的情况下,您正在尝试在数据库的结果集中创建一个新对象( - 但也可以是您自己的类之一)。
因此,对于从数据库查询返回的每一行,您尝试从每行不同的对象(来自您的代码库)创建一列(需要将参数传递给构造函数)。由于底层提供程序无法保证能够动态地从外部源创建任意对象,因此这是不允许的(由 LINQ 提供程序阻止)。
将针对数据库运行的查询是“ debts”。这将返回查询中未过滤的所有行(因为没有WHERE子句)。
下一个查询将在您的代码中运行。在您的代码中,您可以使用参数化构造函数 - 现在是 LINQ To Objects。
因此,区分查询的各个阶段并执行您想要执行的操作的方法是将 放在ToList()针对数据库运行的查询的末尾,以便生成、运行查询并返回结果。然后对这些结果构造并运行下一个查询(在代码中)。
var result = debts.ToList().Select(x => new
{
x.Snowball.User.Email,
x.SnowballID,
x.Description,
x.ID,
x.DueDayOfMonth,
Due = new DateTime(ExecutionDate.Year, ExecutionDate.Month, x.DueDayOfMonth)
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4092 次 |
| 最近记录: |