Convertit la méthode en expression Linq pour la requête

c# expression-trees linq linq-to-sql

Question

Dans notre application, nous souhaitons avoir des méthodes standard pour diverses conditions dans notre base de données. Par exemple, nous avons différents types de transactions et nous voulons créer des méthodes standard pour les récupérer dans d'autres requêtes. Cependant, cela nous donne l'erreur:

La méthode '' n'a pas de traduction prise en charge en SQL

La méthode pourrait ressembler à ceci:

public static bool IsDividend(this TransactionLog tl)
{
    return tl.SourceTypeID == (int)JobType.Dividend || tl.SourceTypeID == (int)JobType.DividendAcct;
}

Pour être utilisé comme tel:

var dividends = ctx.TransactionLogs.Where(x => x.IsDividend());

Bien sûr, si je copie la logique de IsDividend() dans la clause Where , cela fonctionne bien, mais je finis par dupliquer cette logique à plusieurs endroits et il est difficile de la suivre si cette logique change.

Je pense que si je convertissais cela en une expression comme celle-ci, cela fonctionnerait, mais ce n'est pas une configuration aussi préférable que de pouvoir utiliser des méthodes:

public Expression<Func<TransactionLog, bool>> IsDividend = tl => tl.SourceTypeID == (int)JobType.Dividend || tl.SourceTypeID == (int)JobType.DividendAcct;

var dividends = ctx.TransactionLogs.Where(IsDividend);

Existe-t-il un moyen de forcer Linq à évaluer la méthode comme une expression? Ou pour "transformer" l'appel de méthode en une expression dans une requête linq? Quelque chose comme ça:

var dividends = ctx.TransactionLogs.Where(tl => ToExpression(tl.IsDividend));

Nous utilisons Linq-to-SQL dans notre application.

Réponse populaire

Essayez d’utiliser des méthodes d’extension, comme ceci:

public static class TransactionLogExtensions {
    public static IQueryable<TransactionLog> OnlyDividends(this IQueryable<TransactionLog> tl)
    {
        return tl.Where(t=>t.SourceTypeID == (int)JobType.Dividend || t.SourceTypeID == (int)JobType.DividendAcct);
    }
}

Appelez ça comme ça:

var dividends=db.TransactionLogs.OnlyDividends();

ou

var dividends=db.TransactionLogs.OnlyDividends().OrderBy(...);


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow