Mes appologies d'avance pour la question longue. J'ai fait un effort pour que ma question soit aussi claire que possible en une fois. S'il vous plaît, supportez avec moi. o) toute aide sera grandement appréciée!Comment écrire une expression pour une propriété linq to sql?
J'ai les classes Direction et texte:
class Branch
int ID
Text WebDescription
and a bunch of other properties
class Text
int ID
string UK
string NL
string FR
string IT
and a bunch of other properties as well
Je veux afficher uniquement l'ID de la branche et sa description dans la langue appropriée. Je veux seulement une requête (pas d'aller-retour supplémentaire) qui récupère seulement deux champs (pas l'objet entier).
J'ai trouvé trois solutions
Via le modèle d'objet dans la requête
// good: no round trips
// good: clean sql
// bad: impossible to use the currentUserLanguage parameter
var lang = "NL";
var dbProject = new ProjectDataContext();
var query = from b in dbProject.GetTable<Branch>()
select new
{
b.ID,
WebDescription = b.WebDescriptionObject.NL // <-- problem
};
var text = query.First().WebDescription;
Via le modèle d'objet après la requête
// good: no round trips (eager loading of text object)
// good: possible to use the currentUserLanguage parameter
// bad: loads the *whole* branch and text object, not just two fields
var lang= "NL";
var dbProject = new ProjectDataContext();
var query = from b in dbProject.GetTable<Branch>()
select new
{
b.ID,
WebDescription = b.GetWebDescriptionAsString(lang)
};
var text = query.First().WebDescription;
En utilisant une expression
// good: I have the feeling I am on the right track
// bad: This doesn't work :o(throws an exception
var lang= "NL";
var dbProject = new ProjectDataContext();
var query = from b in dbProject.GetTable<Branch>()
select new
{
b.ID,
WebDescription = b.GetWebDescriptionAsExpression(lang)
};
var text = query.First().WebDescription;
Voici le code pour les deux méthodes GetWebDescriptionAsString et GetWebDescriptionAsExpression.
public string GetWebDescriptionAsString(string lang)
{
if (lang== "NL") return WebDescriptionObject.NL;
if (lang== "FR") return WebDescriptionObject.FR;
if (lang== "IT") return WebDescriptionObject.IT;
return WebDescriptionObject.UK;
}
public Expression<Func<Branch, string>> GetWebDescriptionAsExpression(string lang)
{
if (lang== "NL") return b => b.WebDescriptionObject.NL;
if (lang== "FR") return b => b.WebDescriptionObject.FR;
if (lang== "IT") return b => b.WebDescriptionObject.IT;
return b => b.WebDescriptionObject.UK;
}
Oui, je sais. Mais les sql-experts nous ont promis que c'est la performance à suivre (pas sûr s'il a raison). De toute façon, changer la structure n'est plus une option. – Florian
Je suis assez sûr qu'il n'a pas raison :) Une solution serait de mettre la condition directement dans la requête comme: WebDescription = lang == "NL"? b.Text.NL: lang == "FR"? b.Text.FR: ... Je ne l'ai pas testé mais je pense qu'il va produire un sql correct. – Aleris