我执行以下代码时遇到此错误,任何想法如何修复它?
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();
答案 0 :(得分:2)
似乎Math.Min不是由EF查询提供程序实现的。您应该能够通过在项目集合上应用AsEnumerable
来修复它,以便使用Linq to Objects执行表达式;
Items = items.AsEnumerable().Select(i => new ItemToWorkOnModel()...
如果在项目选择中添加where
条件(整个表中的所有项目看起来有点奇怪),您需要在AsEnumerable()之前添加它以允许EF进行过滤在数据库中。
此外,您只需要查询的第一个结果,但是在将列表缩减为单个项目之前,您将使用ToList()
获取所有。您可能希望删除ToList()
,以便EF /基础数据库只能返回单个结果;
result = items.Select(b => new BatchToWorkOnModel()...
答案 1 :(得分:1)
您不需要Math.Min
。
有问题的一行是:
Text = string.IsNullOrEmpty(i.Body)
? "" : i.Body.Substring(0, Math.Min(i.Body.Length, 50)) + (i.Body.Length < 50 ? "" : "...")
那么这条线会返回什么?
如果i.Body
为空或为空,则返回空字符串。如果长度为50或更多字符,则返回50个字符的子字符串并附加“...”
如果长度小于50,则需要一个带有字符串长度的子字符串,并附加一个空字符串。但那只是原始字符串。
Text = string.IsNullOrEmpty(i.Body)
? "" : (i.Body.Length < 50 ? i.Body : i.Body.Substring(0, 50) + "...")