【问题标题】:C# LINQ DataTime ListC# LINQ 日期时间列表
【发布时间】:2015-04-26 18:35:02
【问题描述】:

转换为列表时遇到一些问题

public List<DateTime> findDateBetween(DateTime start,DateTime end)
{
    var query = from entry in sd.gw_chemistry
                where (entry.insert_datetime >=start & entry.insert_datetime<=end & a == entry.well_id & b == entry.indicator_id)
                select entry.insert_datetime;
    return (List<DateTime>)query;
}`

错误: System.InvalidCastException:无法将“System.Data.Objects.ObjectQuery1[System.Nullable1[System.DateTime]]”类型的对象转换为“System.Collections.Generic.List`1[System.DateTime]”。

【问题讨论】:

  • 那些真的是 &s 而不是 &&s?

标签: c# linq entity-framework list datetime


【解决方案1】:

您的代码存在许多问题。

  • 您的查询正在选择DateTime?(或Nullable&lt;DateTime&gt;)类型的元素。如果日期是null,您需要决定要做什么。从结果中排除它?返回默认值?如果你可以确定它永远不会是null,你可以select entry.insert_datetime.Value
  • 您的查询未返回列表,您必须使用 ToList() 将其转换为列表。
  • 对于条件 AND 运算符 (&amp;&amp;),您似乎使用的是 &amp;
  • 您使用的变量 ab 似乎没有在任何地方定义(除非它们是成员变量)。

所以假设ab 是成员变量,而insert_datetime 永远不是null,你可以这样做:

return sd.gw_chemistry
   .Where(e =>
        e.insert_datetime >= start && e.insert_datetime <= end && 
        a == entry.well_id && b == entry.indicator_id)
   .Select(e => e.insert_datetime.Value)
   .ToList();

【讨论】:

  • &amp; 也是逻辑运算符。
【解决方案2】:

正如错误试图告诉你的那样,这不是List&lt;T&gt;,你不能将它转换为它不是的类型。

您可以通过调用.ToList()从查询中创建List&lt;T&gt;

【讨论】:

  • 所以,我更改了对“...select entry.insert_datetime).ToList(); return query”的查询但现在有异常“System.Collections.Generic.List " 输入 "System.Collections.Generic.List"
  • 需要使用.Value获取select子句中可为空的DateTime的值。
【解决方案3】:
public List<DateTime> findDateBetween(DateTime start,DateTime end)
    {var query = from entry in sd.gw_chemistry
        where (entry.insert_datetime >=start & entry.insert_datetime<=end & a == entry.well_id & b == entry.indicator_id)
        select entry.insert_datetime;
        return query.ToList();}

【讨论】:

    【解决方案4】:

    这里没什么大不了的。您只需在您的query 上致电ToList()。但是我确实认为使用&amp; 而不是&amp;&amp; 是一个严重的问题。

    正确的代码应该是这样的:

    public List<DateTime> findDateBetween(DateTime start,DateTime end)
    {
        var query = 
                  from entry in sd.gw_chemistry
                  where (entry.insert_datetime >=start && 
                         entry.insert_datetime<=end && 
                         a == entry.well_id && 
                         b == entry.indicator_id)
                select entry.insert_datetime.Value;
        return query.ToList();
    }`
    

    【讨论】:

    • 不,新问题“System.Collections.Generic.List”键入“System.Collections.Generic.List
    • @byvaet:已编辑。检查新版本。问题是,我们无法通过查看您提供的代码来猜测您的数据结构。如果insert_datetime 可以为空,您应该已经考虑过使用.Value
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多