首页 > 解决方案 > 使用 OpenAccess ORM 在数据库服务器端直接执行方法

问题描述

我正在尝试在数据库服务器端运行查询以将整个过滤结果加载到应用程序中。我尝试在不使用我自己的方法的情况下执行过滤,并且它没有错误地工作。但是如果我在表达式树中使用我自己的方法,我会在执行过程中得到这个错误:

失败:“eventItem.GetEventOfficesIds()”的直接客户端执行失败

private static IQueryable<Guid> GetEventOfficesIds(this Event eventItem)
{
    IQueryable<Guid> officesIds;
    if (eventItem.GetValue<bool?>("IsPublicNews") != null &&
        eventItem.GetValue<bool?>("IsPublicNews").HasValue && eventItem.GetValue<bool?>("IsPublicNews").Value)
    {
        officesIds = new List<Guid>().ToArray().AsQueryable();
    }
    else
    {
        officesIds = eventItem.GetValue<TrackedList<Guid>>("Offices")?.ToArray().AsQueryable();
    }

    return officesIds;
}

...

EventsManager manager = EventsManager.GetManager();
IQueryable<Event> eventItems = manager.GetEvents();
Expression<Func<Event, bool>> officeFilter = eventItem =>
    eventItem.GetEventOfficesIds().Contains(office.Value) && !eventItem.GetEventOfficesIds().Any();
if (office != null && office.Value != Guid.Empty)
{
    eventItems = eventItems.Where(officeFilter);
}

我可以更改我的方法的代码还是 OpenAccess ORM 不支持手动编写的执行方法?

标签: c#sitefinitytelerik-open-access

解决方案


我会把它简化成这样的:

using Telerik.Sitefinity.Data.Linq.Dynamic;

EventsManager manager = EventsManager.GetManager();
IQueryable<Event> eventItems = manager.GetEvents();

if (office != null && office.Value != Guid.Empty)
{
    eventItems = eventItems
                   .Where("IsPublicNews = true")
                   .Where(e => e.GetValue<TrackedList<Guid>>("Offices")?.ToArray().Contains(office.Value))
}

推荐阅读