【问题标题】:LINQ to Entities ToString() - None of the proposed solutions work?LINQ to Entities ToString() - 建议的解决方案都不起作用?
【发布时间】:2011-09-04 10:19:14
【问题描述】:

我发布更多内容是因为我想了解更多信息,因为我的解决方法是基本上避免使用 LINQ to Entities!如果我能用它就好了。所以如果有人能启发我..

我正在开发一个使用代码优先实体框架作为数据模型的 ASP.Net MVC 3 应用程序(我的第一个应用程序)。这将是一个在线商店,我正在开发“管理员”控制器,作为管理员,您将能够编辑产品等。在添加新产品时,您必须指定一个类别,这意味着类别的下拉列表。

根据我找到的here 的信息,我首先在 ViewBag 中返回一个 IEnumerable 类别集合。这似乎是一种非常好的处理方式。

但我遇到了与您将在下面看到的相同的错误。因此,根据我在网上阅读的建议,我创建了一个单独的模型,专门用于创建新产品和编辑现有产品。 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.Data.Objects.SqlClient.SqlFunctions'上的指定方法'System.String StringConvert(System.Nullable`1[System.Double])'无法转换为 LINQ to Entities 存储表达式。"。

我什至尝试向名为 IdAsString 的数据类添加一个只读属性,但这显然让 Entity Framework 很不高兴!

最后,我意识到我投入的所有时间并不值得,因此完全停止使用 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;
        }
    }

因此,如果有人已经在这样做并且他们认为他们正在以“正确”的方式进行操作,那么我很想知道您的想法!

【问题讨论】:

    标签: c# asp.net-mvc-3 linq-to-entities drop-down-menu entity-framework-4.1


    【解决方案1】:

    在调用 ToString 之前将查询具体化将使最后一部分成为非 linq-to-entities 查询。您可以通过仅选择 id 和描述,然后调用 AsEnumerable,然后获取 selectlistitems 来优化它。

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

    【讨论】:

    • 哇。真的就这么简单-谢谢!!我觉得它“应该”很简单!
    • 您也可以使用AsEnumerable 代替ToList。分配一个只会被枚举的列表是没有意义的。使用AsEnumerable,您将只枚举每个项目一次,而不是使用ToList 两次。如果您返回的结果很少,则不会有任何明显的差异。
    猜你喜欢
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多