1

执行以下代码时出现此错误,有什么想法可以解决吗?


LINQ to Entities does not recognize the method 'Int32 Min(Int32, Int32)' method, and this method cannot be translated into a store expression.

result = items.ToList()
                    .Select(b => new BatchToWorkOnModel()
                    {
                        BatchID = b.Batch.ID,
                        SummaryNotes = b.Batch.Notes,
                        RowVersion = b.Batch.RowVersion,
                        Items = items
                            .Select(i => new ItemToWorkOnModel()
                            {
                                SupplierTitle = i.Title,
                                ItemID = i.ID,
                                BatchID = i.BatchID ?? 0,
                                ItemDate = i.PubDate,
                                // KB - Issue 276 - Return the correct Outlet name for each item
                                Outlet = i.Items_SupplierFields != null ? i.Items_SupplierFields.SupplierMediaChannel != null ? i.Items_SupplierFields.SupplierMediaChannel.Name : null : null,
                                Status = ((short)ItemStatus.Complete == i.StatusID ? "Done" : "Not done"),
                                NumberInBatch = i.NumInBatch,
                                Text = string.IsNullOrEmpty(i.Body) ? "" : i.Body.Substring(0, Math.Min(i.Body.Length, 50)) + (i.Body.Length < 50 ? "" : "..."),
                                IsRelevant = i.IsRelevant == 1,
                                PreviouslyCompleted = i.PreviouslyCompleted > 0 ? true : false
                            }).ToList()
                    })
                    .FirstOrDefault();
4

2 回答 2

2

EF 查询提供程序似乎没有实现 Math.Min。您应该能够通过简单地应用AsEnumerable您的项目集合来使用 Linq to Objects 执行表达式来修复它;

Items = items.AsEnumerable().Select(i => new ItemToWorkOnModel()...

如果where向项目选择添加条件(获取整个表中的所有项目似乎有点奇怪),您需要在 AsEnumerable() 之前添加它以允许 EF 在数据库中进行过滤。

此外,您只需要查询的第一个结果,但是在将列表切割为单个项目之前,您要使用它们来获取所有结果。ToList()您可能希望删除ToList()EF/底层数据库只能返回一个结果;

result = items.Select(b => new BatchToWorkOnModel()...
于 2013-07-22T08:48:32.227 回答
1

你不需要Math.Min

有问题的行是:

Text = string.IsNullOrEmpty(i.Body)
       ? "" : i.Body.Substring(0, Math.Min(i.Body.Length, 50)) + (i.Body.Length < 50 ? "" : "...")

那么这条线返回了什么?

如果i.Body为 null 或为空,则返回一个空字符串。如果它的长度为 50 个或更多字符,则返回 50 个字符的子字符串并附加“...”。
如果长度小于 50,它需要一个带有字符串长度的子字符串并附加一个空字符串。但这只是原始字符串。

Text = string.IsNullOrEmpty(i.Body)
       ? "" : (i.Body.Length < 50 ? i.Body : i.Body.Substring(0, 50) + "...")
于 2013-07-22T12:51:34.627 回答