我是一名新的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中修复此方法?
答案 0 :(得分:1)
您的查询未选择item
;它选择一个新的匿名对象,该对象具有带项值的单个字符串属性。如果您想返回一个只需select item
而不是您拥有的select语句的项目列表。如果您只想选择ID,则应改为select item.ID
并将查询的返回类型更改为IEnumerable<int>
或ID的类型。
答案 1 :(得分:0)
这是一个与Servy的建议一致的代码示例 你有几件事情在这里发生:
解决#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]