none
Ef查询 RRS feed

  • 问题

  • 这个我的代码

    public MobileEventDetailModel GetDetails(string applicationId)
    {
        var @event = (from e in _eventsRepository.DataContext.Events.Include(q => q.Assets.Select(a => a.Asset))
                      where GetEvent(e, applicationId)
                    select new
                        {
                            e.Id,
                            e.EventParent.Name,
                            LogoId = (from a in e.Assets
                                         where a.Type   == EventAssetType.Logo
                                         select a.AssetId).FirstOrDefault()
                        }).FirstOrDefault();
     
        return new MobileEventDetailModel
            {
                Id = @event.Id,
                Name = @event.Name,
                Logo = string.Format("{0}{1}{2}", Config.BaseUrl, Config.ImagesPath, @event.LogoId)
            };
    }
     
    public bool GetEvent(Event @event, string applicationId)
    {
     
        return @event.Active && @event.Visible && @event.MobileEventApplications.Any(m =>
                              m.MobileApplication.ApplicationId == applicationId &&
                              (!m.MobileApplication.ActivationLength.HasValue || EntityFunctions.AddDays(DateTime.Now, 1) < EntityFunctions.AddMonths(m.MobileApplication.DateActivated, m.MobileApplication.ActivationLength.Value)));
    }
     运行是报错,错误消息如下:
    LINQ to Entities does not recognize the method 'Boolean GetEvent(Tournaments.Data.Entities.Event, System.String)' method, and this method cannot be translated into a store expression.
    请问怎么解决啊?
    2016年2月4日 14:00

答案

  • 你好,

    可以使用Expression,代码如下:

    public MobileEventDetailModel GetDetails(string applicationId)
    {
    
        var event = _eventsRepository.DataContext.Events.Include(q => q.Assets.Select(a => a.Asset))
                    .Where(GetEvent(applicationId))
                    .Select(a =>  new
                        {
                            a.Id,
                            a.EventParent.Name,
                            LogoId = (from b in a.Assets
                                         where b.Type == EventAssetType.Logo
                                         select b.AssetId).FirstOrDefault()
                        }).FirstOrDefault();
    
        return new MobileEventDetailModel
            {
                Id = event.Id,
                Name = event.Name,
                Logo = string.Format("{0}{1}{2}", Config.BaseUrl, Config.ImagesPath, event.LogoId)
            };
    }
    
    public Expression<Func<Event, bool>> GetEvent(int applicationId)
    {
        return = a => a.Active 
                      && a.Visible 
                      && a.MobileEventApplications
                          .Any(m => m.MobileApplication.ApplicationId == applicationId 
                                    && (!m.MobileApplication.ActivationLength.HasValue 
                                        || EntityFunctions.AddDays(DateTime.Now, 1) 
                                           < EntityFunctions
                                             .AddMonths(m.MobileApplication.DateActivated, m.MobileApplication.ActivationLength.Value)
                                       )
                          );
    }

    Best regards,

    Cole Wu

    2016年2月9日 11:57