在LINQ查询中创建DateTime

时间:2017-02-06 22:36:33

标签: c# linq datetime

我收到以下错误:

  

LINQ中仅支持无参数构造函数和初始值设定项   实体。

我正在尝试从结果集中查询数据,而新结果集的一部分会返回一个新的日期字段。

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();

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

4 个答案:

答案 0 :(得分:2)

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) 
});

答案 1 :(得分:0)

您可以使用无参数构造函数创建自己的Date类,并使用属性初始化器语法设置它,如

Due = new Date(){Year = ExecutionDate.Year, Month = ExecutionDate.Month, Day = x.DueDayOfMonth}

然后只需定义从Date到DateTime的转换。

答案 2 :(得分:0)

你可以试试这个:

<?php
foreach ($tema_s as $item):
    $query_string = urlencode($item['pltfrm']. '=' .$item['notid']);
    $title = htmlspecialchars($item['ttl']);
    $src = urlencode($item['pic1']);
    $alt = htmlspecialchars($item['rlcn']);
    $date = ucfirst(strftime("%A %e de %B del %Y", date(strtotime($item['fch']))));
?>
<article class="notxtras">
    <a class="notxtras_url_cntn" href="cdn.php?<?= $query_string ?>" title="<?= $title ?>">
        <div class="notxtras_img_cntn">
            <img src="http://cadenanoticias.mx/img/miniatura/"<?= $src ?>" alt="<?= $alt ?>">
        </div>
        <h1 class="notxtras_ttl_cntn"><?= $title ?></h1>
        <p class="notxtras_brv_cntn"><?= htmlspecialchars($item['brv']) ?></p>
        <p class="notxtras_dsp_cntn">
            Por:&nbsp;&nbsp;"<?= htmlspecialchars($item['aut']) ?>
            &bull; <?= htmlspecialchars($item['cdd']) ?>
            &bull; <?= $date ?>
        </p>
    </a>
</article>";
<?php endforeach; ?>

答案 3 :(得分:0)

我来到这里寻找同样的事情,但是在进一步的研究中发现了在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();

编辑:这适用于EF6及更高版本,对于早期版本的EF,使用System.Data.Entity.Core.Objects.EntityFunctions而不是DbFunctions