2011-11-03 2 views
7

Qualcuno ha un suggerimento su come rendere questa funzione supportata da LINQ a SQL?Metodo X non ha traduzione supportata in SQL - booleans e datetime

public bool IsEnabled() 
{ 
    return !this.Disabled && 
      ((!this.EnabledFrom.HasValue || this.EnabledFrom < DateTime.Now) && 
      (!this.EnabledTo.HasValue || this.EnabledTo > DateTime.Now)); 
} 

Disabled è un bool, EnabledFrom e EnabledTo è DateTime? e tutti i campi del database.

+1

Non sembra esserci alcuna LINQ nel codice che avete mostrato. Dubito che questo sia il codice che causa il tuo errore. – BlueMonkMN

+2

Esempio di query (parte di esso) utilizzando IsEnabled; query = query.Where (a => a.PageMeta.Hidden ==! Visible && a.PageMeta.IsEnabled() == visible); – Eilev

+1

Il problema è probabilmente che tenta di trovare IsEnabled in SQL. Spostare la logica da IsEnabled direttamente alla query linq. – Beku

risposta

6

Effettuare il proprio metodo restituendo un'espressione.

vedere qui: http://www.atrevido.net/blog/2007/09/05/Calling+Custom+Methods+In+LINQtoSQL.aspx

Qualcosa di simile al di sotto (non testata):

static Expression<Func<Account, bool>> IsEnabled = a => 
    !a.Disabled && 
    ((!a.EnabledFrom.HasValue || a.EnabledFrom < DateTime.Now) && 
    (!a.EnabledTo.HasValue || a.EnabledTo > DateTime.Now)); 
+0

Sembra fantastico! Ma sai come posso accedere a IsEnabled attraverso un EntityRef: .Where (a => a.Account.IsEnabled) <- questo non funziona – Eilev

+0

'.Where (IsEnabled)' –

+0

. Dovunque verrà eseguito sull'oggetto nella query , ma "Account" è un EntityRef sugli oggetti. Funzionerà: query.Select (a => a.Account) .Where (IsEnabled) - ma in questo caso ottengo solo account in cambio, ho bisogno degli oggetti originali – Eilev