2013-11-04 29 views
0

反正有這個錯誤嗎?我想在其他查詢中重複使用相同的lamba表達式,而不是重複。 LinqKit或其他linq表達能做到這一點嗎?實體框架查詢中的使用方法

錯誤

LINQ實體無法識別方法「布爾GetEvent(Tournaments.Data.Entities.Event,System.String)」方法,和這種方法不能被翻譯成表達商店。

代碼

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))); 
} 
+0

我不認爲LINQkit或其他擴展可以提供幫助。您不能使用.net中的方法或函數,因爲它們不能轉換爲SQL。您可以使用包含標準Sql Server函數的SqlFunctions。 – Nilesh

回答

1

您需要使用表達式:

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) 
            ) 
        ); 
} 

更新:對不起,這是遲到的晚上,改變的版本是希望更多的是你所期待的。