如何在 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 匿名类型成员声明符无效。匿名类型 必须使用成员分配、简单名称或 会员访问。
如何处理此转换?
这意味着您需要为该匿名成员的值分配名称。
例如:
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 类。