在LINQ select方法中使用URL.Action

本文关键字:URL Action LINQ select 方法 | 更新日期: 2023-09-27 18:00:36

我想创建一个包含列表项的视图模型,每个项都将包含编辑和删除操作URL,因此我有以下代码:

        public ActionResult Index()
        {
            AdministrationViewModel model = new AdministrationViewModel();
            using (var _context = new CamelotFaultManagementEntities())
            {
                model.FaultTypes = new ListViewModel()
                {
                    ListTitle = AdministrationStrings.FaultTypesAdministrationTab,
                    AddNewItemURL = "#",
                    AddNewItemButtonTitle = SharedStrings.Add + " " + SharedStrings.FaultType,
                    ListItems = _context.FaultTypes.Select(type => new ListItemViewModel() { 
                        ListItemID = type.FaultTypeID,
                        ListItemName = type.FaultTypeName,
                        ListItemDescription = type.FaultTypeDescription,
                        DeleteActionURL = @Url.Action("DeleteFaultType","Administration", new {FaultTypeID = type.FaultTypeID}),
                        EditActionURL = @Url.Action("EditFaultType", "Administration", new { FaultTypeID = type.FaultTypeID }),
                    }).ToList()
                };
            }
            return View("Administration",model);
        }

问题是我在运行时收到一个错误

LINQ to Entities无法识别方法"System.String"Action(System.String、System.String、System.Object)'方法,并且方法无法转换为存储表达式。

任何克服这一点的方法。。。我真的不想自己开始创建这些URL。

在LINQ select方法中使用URL.Action

您的问题在这里:

DeleteActionURL = @Url.Action("DeleteFaultType","Administration", /*...*/),
EditActionURL = @Url.Action("EditFaultType", "Administration", /*...*/)

LINQ试图创建表达式树,它将被映射到SQL代码,但它不知道如何映射Url.Action。解决此问题的一种方法是Linq更改为Entities,将Linq改为Objects,这可以在您的实体上使用ToList()方法:

ListItems = _context.FaultTypes.ToList().Select(i => ...)