1

我是一名新的 ASP.NET 开发人员,我正在尝试在我的 DAL 中使用 LINQ to Entities。我现在正在努力使用 GetInfo() 方法,我希望它从 Items Entity 中检索所有项目的信息作为列表。然后,我可以将列表绑定到 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 中修复此方法?

4

2 回答 2

1

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

于 2013-10-30T20:34:10.113 回答
0

这是与 Servy 的建议一起使用的代码示例您这里有几件事:

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

解决#1:
问题是,由于您选择的是客户的子集(和匿名类型),因此您没有返回 IEnumerable<Item> 它是 IEnumerable<SomeAnonymousType>

这就是为什么你有一个编译时错误。

所以,这是第一部分(这将返回一个整数列表)

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

我会遇到问题,因为 Entity Framework 将在 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 服务器不必进行转换(但您会返回整数,而不是字符串,假设 Item.Id 是一个整数):

SELECT
[c].[CustomerId] AS [CustomerId]
FROM [dbo].[Customer] AS [c]
于 2013-10-30T21:54:07.973 回答