如何使用 LINQ To-Entities 在数据访问层中修复此 GetInfo() 方法
本文关键字:GetInfo 方法 LINQ 何使用 To-Entities 访问 数据 | 更新日期: 2023-09-27 18:37:28
我是一个新的 ASP.NET 开发人员,我正在尝试在我的DAL中使用LINQ to Entities。我现在正在努力使用 GetInfo() 方法,我希望它以列表形式从项目实体中检索所有项目的信息。然后,我可以将列表绑定到 GridView。Visual Studio 在 GetInfo() 方法中的以下 linq 语句下不断给我一条红线的问题:
return selectQuery.ToList();
GetInfo() 方法代码:
public class Item
{
public decimal ID { get; set; }
public string Name { get; set; }
public Item()
{
}
public List<Item> GetInfo()
{
using (Entities entities = new Entities())
{
IEnumerable<item> selectQuery = (from item in entities.Items
orderby item.ID
select new {item.ID.ToString()};
return selectQuery.ToList();
}
}
}
那么如何在我的 DAL 中修复此方法呢?
您的查询不会选择item
;它会选择一个新的匿名对象,该对象具有带有项目值的单个字符串属性。 如果要返回项目列表,只需select item
,而不是您拥有的 select 语句。 如果只想选择 ID,则应改为select item.ID
查询的返回类型更改为 IEnumerable<int>
或任何 ID 类型。
这是一个代码示例,可以配合 Servy 的建议您在这里发生了几件事:
- 看起来您只想返回 Item.Id,而不是所有列
- 看起来好像您想将 Item.Id 转换为字符串
要解决#1:
问题是,由于您正在选择客户子集(和匿名类型),因此您不会返回 IEnumerable
这就是出现编译时错误的原因。
所以,这是第一部分(这将返回一个整数列表)
public IEnumerable<int> GetInfo()
{
var query = from item in Entities.Items
orderby item.Id
select item.Id;
return query.ToList();
}
(我正在选择整数,所以我返回了一个可枚举的整数)
现在,这是问题的一部分,但您需要将项目设置为字符串。 需要了解的重要事项是:在强制枚举查询之前放入查询的任何运算符或函数都将是 SQL 的一部分。 强制枚举(执行)查询的点是调用 ToList() 时
所以,如果我尝试这样做:
select item.Id.ToString();
我会遇到一个问题,因为实体框架将在SQL中寻找ToString()函数(你会得到一个例外)
要用于执行此操作的运算符是 Cast<> 方法
它看起来像这样:
public IEnumerable<int> GetInfo()
{
var query = from item in Entities.Items
orderby item.Id
select item.Id;
return query.Cast<string>();
}
顺便说一句,如果你只是在学习 linq 和 ef,我强烈建议你尝试 LinqPad - 这是处理这些东西的好方法。
还有一点要记住,如果你使用 Cast() 函数,它会将你发送到服务器的 SQL 更改为:
SELECT
CAST( [c].[CustomerId] AS nvarchar(max)) AS [C1]
FROM [dbo].[Customer] AS [c]
如果你省略了 Cast(),那么 SQL 服务器不必进行转换(但你会得到 ints,而不是字符串,假设 Item.Id 是一个 int):
SELECT
[c].[CustomerId] AS [CustomerId]
FROM [dbo].[Customer] AS [c]