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

时间:2013-10-30 20:31:49

标签: c# asp.net linq-to-entities

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这是一个与Servy的建议一致的代码示例 你有几件事情在这里发生:

  1. 看起来好像只想返回Item.Id,而不是所有列
  2. 看起来好像要将Item.Id转换为字符串
  3. 解决#1:
    问题是,由于您正在选择客户的子集(以及匿名类型),因此您不会返回IEnumerable&lt; Item&gt;它是一个IEnumerable&lt; SomeAnonymousType&gt;

    这就是你有编译时错误的原因。

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

    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&lt;&gt;方法

    看起来像这样:

    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服务器不必进行转换(但是你得到的是int,而不是字符串,假设Item.Id是一个int):

    SELECT
    [c].[CustomerId] AS [CustomerId]
    FROM [dbo].[Customer] AS [c]