如何在LINQ中执行数据类型转换?

时间:2014-12-31 18:41:24

标签: c# linq

我在下面给出了一个查询,我想在其中转换它的类型。

Select
CONVERT(date, o.OrderDate)as OrderDate
From Orders

我正在撰写以下声明:

var r= (
                    from o in db.Orders
                    select new { o.OrderNumber,o.Name,o.State,Convert.ToDateTime(o.OrderNumber) }
                ).ToList();

所以它给出了错误:

  

错误18无效的匿名类型成员声明符。匿名类型   必须使用成员作业,简单名称或成员声明成员   会员访问。

如何处理此转换?

4 个答案:

答案 0 :(得分:1)

这意味着您需要将名称分配给该匿名成员的值。

例如:

from o in db.Orders
select new { OrderNumber = o.OrderNumber, Name = o.Name,
            State = o.State, Date = Convert.ToDateTime(o.OrderNumber) }

答案 1 :(得分:1)

您需要命名您的匿名类型的成员。有时编译器会自动选择一个名称(例如,在分配属性时),但有时候,它是不可能的:

                                            vvvv
 new { o.OrderNumber, o.Name, o.State, OrderDateTime = Convert.ToDateTime(o.OrderNumber) }

答案 2 :(得分:1)

尝试

var r= (from o in db.Orders
    select new { o.OrderNumber,o.Name,o.State,
                 OrderDate = Convert.ToDateTime(o.OrderDate) }
                ).ToList();

修改

首先尝试实现查询。

var query = db.Orders.ToList().Select(o => new {
o.OrderNumber,
o.Name,
o.State,
OrderDate = Convert.ToDateTime(o.OrderNumber)
}).ToList();

答案 3 :(得分:0)

执行LINQ to Entities查询时,它将使用基础数据提供程序转换为等效的数据库端代码。

恰好没有从Convert.ToDateTime()到SQL Server等效的映射。

相反,在您按如下方式检索数据后,您将在内存中执行此操作。

var r= 
    (from o in db.Orders
    select new { o.OrderNumber, o.Name, o.State })
    .AsEnumerable() // Execute the above query
    .Select(order => new { order.OrderNumber, order.Name, order.State, OrderDate = Convert.ToDateTime(order.OrderNumber)})
    .ToList();

(为了便于阅读,您还可以将其拆分为两个查询。)

您还可以在L2E查询中使用转换为其数据库等效项的函数。

有关详情,请参阅SqlFunctionsEntityFunctions课程。