Asp.net mvc Asp MVC Telerik网格和实体框架中枚举的处理

Asp.net mvc Asp MVC Telerik网格和实体框架中枚举的处理,asp.net-mvc,entity-framework,enums,telerik,telerik-grid,Asp.net Mvc,Entity Framework,Enums,Telerik,Telerik Grid,对于开发中的web应用程序(ASP.NETMVC),我使用的是telerik网格。网格绑定到我的列表的IQueryable,因为它是一个大表,我希望telerik在列表上应用它的过滤器,然后执行这个结果,而不是加载10000行(使用联接表),然后使用过滤器,只使用行 我正在使用网格的过滤器/顺序(我真的需要这个页面,这是关键特性之一) 其中一个主列(确定数据的类型)是枚举 问题是,在尝试对指定类型成员进行筛选/排序时,我会得到一个“指定类型成员在linq to entities中不受支持” 我必

对于开发中的web应用程序(ASP.NETMVC),我使用的是telerik网格。网格绑定到我的列表的IQueryable,因为它是一个大表,我希望telerik在列表上应用它的过滤器,然后执行这个结果,而不是加载10000行(使用联接表),然后使用过滤器,只使用行

我正在使用网格的过滤器/顺序(我真的需要这个页面,这是关键特性之一)

其中一个主列(确定数据的类型)是枚举

问题是,在尝试对指定类型成员进行筛选/排序时,我会得到一个
“指定类型成员在linq to entities中不受支持”

我必须将它绑定到enum(而不是映射的int)上,因为如果我使用id,filters/orderby将位于int上,并且我不能期望用户知道外部表的id

我只是不能再次实现我自己的所有网格参数(位于url中)(我假设,要么我什么都做,要么什么都不做)并正确地过滤它,正确地排序它)


你有解决问题的办法吗?

你真的没有选择余地(或者只有几个恼人的选择)

是否使用类而不是枚举(但如果使用枚举,那是因为它更好)

或者对枚举进行“伪排序”,并使用映射的int

public enum TT
    {
        Brown = 0,
        Green = 1
    }
当然,您必须检查数据库中的实际数据(映射int),并更新它们以符合新的顺序(不能更改枚举顺序而不产生影响)。每次要在现有枚举值之间插入值时,都必须这样做


或者您等待下一个EF/linq/c#版本,它应该在linq2entities中具有enum支持

我不知道您的实体模型看起来如何,但我假设您有类似于此模型的东西:

public partial class Project
{    
    public int Id { get; set; } 
    public string Name { get; set; }
    public int Status { get; set; }
}
Status属性表示您的枚举值,然后您可以使用此枚举:

public enum ProjectStatuses
{
    Current = 1,
    Started = 2,
    Stopped = 3,
    Finished = 4,
}
然后创建新的ViewModel,如下所示:

public class ProjectDetails
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Status { get; set; }
        public ProjectStatuses StatusValue { get { return (ProjectStatuses) Status; } }
        // This property to display in telerik ClientTemplate
        public string StatusName { get { return Enum.GetName(typeof (ProjectStatuses), Status ); } }            
    }
由于我喜欢扩展方法,我将添加以下方法:

public static class ModelListExtensions
{
        public static IQueryable<ProjectDetails> ToViewModelDetails(this IQueryable<Project> modelList)
        {
            return modelList.Select(m => new ProjectDetails
                                             {
                                                 Id = m.Id,
                                                 Name = m.Name,
                                                 Status = m.Status,
                                              };
         }
}

我就是不能,这个网站是本地化的,所以有时候棕色的会排在第一位,有时候绿色的会排在第一位。我不能把一个类放在这里,数据库设计在几个月前就被API/backup/锁定了。。。需要。(正如您所说,这确实是DB的最佳选择。我知道会发生这种情况,但这应该是一个解决办法。在将网格绑定到我的模型的属性时,是否可以这样做?@J4N如果您不想添加ViewModel类,那么您可以将您的模型扩展到一个分部类中,然后将另外两个属性放入其中“
StatusValue
StatusName
"在我们的示例中。为了确定,您能告诉我您是如何在视图中将数据绑定到网格的吗?您的解决方案看起来非常棒,我将在接下来的几天内尝试它!如果它有效,我肯定会给您一杯啤酒!我对GridCommand一无所知。如果我有服务器绑定,我想我可以将其作为我的活动的参数如果你想用我的方式在“Where,Sort,Page and GroupBy”方法中使用我的方式,那么你应该使用Telerik.Web.Mvc.Extensions向你的控制器添加

    public ActionResult Index()
    {
        int total;
        var viewModel = getGridList(out total);
        ViewBag.Total = total;
        return View(viewModel);
    }

    //this Action to get ajax pages
    [GridAction(EnableCustomBinding = true)]
    public ActionResult ReGetIndex(GridCommand command, int roleId)
    {
        int total;
        var list = getGridList(out total, roleId, command);
        return View(new GridModel {Data = list, Total = total});
    }


    private IEnumerable<ProjectDetails> getGridList(out int total, GridCommand command = null)
    {
        command = command ?? new GridCommand {Page = 1};
    foreach (var descriptor in command.SortDescriptors)
    {
        if (descriptor.Member == "StatusValue")
            descriptor.Member = "Status";

    }
    foreach (FilterDescriptor descriptor in command.FilterDescriptors)
    {
        if (descriptor.Member == "StatusValue")
            descriptor.Member = "Status";
    }

    var list = modelService.AllAsQuery()
            .ToViewModelDetails() // To convert it to our ViewModel if we have one
            .Where(command.FilterDescriptors);

    total = list.Count();

    return (IEnumerable<ProjectDetails>) list.Sort(command.SortDescriptors)
                                                  .Page(command.Page - 1, command.PageSize)
                                                  .GroupBy(command.GroupDescriptors).ToIList();
}
@model IEnumerable<ProjectDetails>
@{
    Html.Telerik()
        .Grid(Model)
        .Name("ProjectsGrid")
        .Sortable()
        .Filterable()
        .EnableCustomBinding(true)
        .DataBinding(dataBinding => dataBinding
                                        .Ajax()
                                        .Select("ReGetIndex", "Projects"))
        .Pageable(page => page.Style(GridPagerStyles.PageSizeDropDown | GridPagerStyles.NextPreviousAndNumeric).Total(ViewBag.Total))
        .Columns(column =>
                     {
                         column.Bound(m => m.Id).Hidden(true);
                         column.Bound(m => m.Name);
                         column.Bound(m => m.StatusValue).ClientTemplate("<#= StatusName #>");
                     })
        .Render();
}
 if (!command.SortDescriptors.Any())
 {
     command.SortDescriptors.Add(new SortDescriptor {Member = "YourDefaultProperty"});
 }