LINQ to Entities ToString() -提议的解决方案都不起作用
本文关键字:解决方案 不起作用 Entities to ToString LINQ | 更新日期: 2023-09-27 18:07:35
我发表这篇文章是因为我想了解更多,因为我的解决办法基本上是避免使用LINQ到实体!不过如果我能用的话就太好了。所以,如果有人能启发我…
我正在做ASP。Net MVC 3应用程序(我的第一个)使用代码优先实体框架作为我的数据模型。这将是一个网上商店,我正在"管理"控制器工作,在那里,作为一个管理员,你将能够编辑产品等。当添加新产品时,您必须指定一个类别,这意味着一个类别的下拉列表。
我开始只是返回一个IEnumerable集合的类别在ViewBag中,基于我在这里找到的信息。这似乎是一个非常好的处理问题的方法。
但是我得到了和你下面看到的相同的错误。因此,根据我在网上看到的一个建议,我创建了一个单独的模型,专门用于创建新产品和编辑现有产品。Categories集合用于在视图中构建一个下拉列表。
public class ProductModel
{
public int Id { get; set; }
public int CategoryId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public double Price { get; set; }
public bool IsVisible { get; set; }
public IEnumerable<SelectListItem> Categories
{
get
{
return new DataAccess()
.Categories
.OrderBy(c => c.Description)
.Select(c => new SelectListItem
{
Value = c.Id.ToString(),
Text = c.Description
});
}
}
}
这将导致以下错误消息:"LINQ to Entities不识别方法'System '。String ToString()'方法,此方法不能转换为存储表达式。"。一个建议的在线解决方案是使用实体框架提供的SqlFunction方法。所以我尝试了这个…
public IEnumerable<SelectListItem> Categories
{
get
{
return new DataAccess()
.Categories
.OrderBy(c => c.Description)
.Select(c => new SelectListItem
{
Value = SqlFunctions.StringConvert((double)c.Id),
Text = c.Description
});
}
}
但是这会导致这个错误消息:"指定的方法'System. '字符串StringConvert (System.Nullable"1 [System.Double])"System.Data.Objects.SqlClient类型。".
我甚至尝试添加一个只读属性的数据类称为IdAsString,但这显然使实体框架非常不高兴!
最后,我意识到它不值得我投入所有的时间,并完全停止使用LINQ。这工作得很好,但如果有一个"正确"的方法来做到这一点,实际上是有效的,那就太好了!
这是我目前的工作解决方案:
public IEnumerable<SelectListItem> Categories
{
get
{
var dal = new DataAccess();
var categories = dal.Categories;
var items = new List<SelectListItem>();
foreach (var category in categories)
items.Add(new SelectListItem
{
Value = category.Id.ToString(),
Text = category.Description
});
return items;
}
}
所以,如果有人已经这样做了,他们认为他们这样做是"正确"的方式,那么我很想知道你的想法!
在调用ToString之前实现查询将使最后一部分成为非链接到实体的查询。您可以通过只选择id和描述,然后调用AsEnumerable,然后获得selectlistitems来优化它。
return new DataAccess()
.Categories
.OrderBy(c => c.Description)
.AsEnumerable()
.Select(c => new SelectListItem
{
Value = c.Id.ToString(),
Text = c.Description
});