Use method in entity framework query


Is there anyway around this error? I'd like to reuse the same lamba expression in other queries instead of having duplication. Can LinqKit or other linq expression do this?


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.


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
                        LogoId = (from a in e.Assets
                                     where a.Type   == EventAssetType.Logo
                                     select a.AssetId).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)));

Accepted Answer

You need to use an Expression:

public MobileEventDetailModel GetDetails(string applicationId)

    var event = _eventsRepository.DataContext.Events.Include(q => q.Assets.Select(a => a.Asset))
                .Select(a =>  new
                        LogoId = (from b in a.Assets
                                     where b.Type == EventAssetType.Logo
                                     select b.AssetId).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)

Update: Sorry it was late the other night, the changed version is hopefully more what you were looking for.

Licensed under: CC-BY-SA
Not affiliated with Stack Overflow
Is this KB legal? Yes, learn why