在 LINQ 查询中创建 DateTime

Cra*_*aig 0 c# linq datetime

我收到以下错误:

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)

有没有办法可以创建这个推断的日期时间?

she*_*ens 6

我来到这里寻找同样的东西,但在进一步的研究中发现了另一种在 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


Ste*_*ore 5

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)