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

本文关键字:执行数 数据 类型转换 执行 LINQ | 更新日期: 2023-09-27 18:35:59

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

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 匿名类型成员声明符无效。匿名类型 必须使用成员分配、简单名称或 会员访问。

如何处理此转换?

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

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

例如:

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

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

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

尝试

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

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

碰巧没有从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 查询中使用一些函数,这些函数将转换为其数据库等效项。

有关详细信息,请参阅 SqlFunctions 和 EntityFunctions 类。