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;
        }
    }
所以,如果有人已经这样做了,他们认为他们这样做是"正确"的方式,那么我很想知道你的想法!

LINQ to Entities ToString() -提议的解决方案都不起作用

在调用ToString之前实现查询将使最后一部分成为非链接到实体的查询。您可以通过只选择id和描述,然后调用AsEnumerable,然后获得selectlistitems来优化它。

    return new DataAccess() 
        .Categories 
        .OrderBy(c => c.Description)
        .AsEnumerable()
        .Select(c => new SelectListItem 
            { 
                Value = c.Id.ToString(), 
                Text = c.Description 
            });