如何使用 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 中修复此方法呢?

如何使用 LINQ To-Entities 在数据访问层中修复此 GetInfo() 方法

您的查询不会选择item;它会选择一个新的匿名对象,该对象具有带有项目值的单个字符串属性。 如果要返回项目列表,只需select item,而不是您拥有的 select 语句。 如果只想选择 ID,则应改为select item.ID查询的返回类型更改为 IEnumerable<int> 或任何 ID 类型。

这是一个代码示例,可以配合 Servy 的建议您在这里发生了几件事:

  1. 看起来您只想返回 Item.Id,而不是所有列
  2. 看起来好像您想将 Item.Id 转换为字符串

要解决#1:
问题是,由于您正在选择客户子集(和匿名类型),因此您不会返回 IEnumerable它是 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]