C #, LINQ, SQL: colonnes composées

J'ai une entité LINQ dont j'ai besoin pour créer une valeur de string spéciale. Il y a 7 valeurs différentes séparées par "-". Certains des champs utilisés sont dans cette table, tandis que certains d'entre eux sont dans des tables différentes. Je voudrais append ce champ à l'entité d'une façon ou d'une autre de sorte que je n'ai pas besoin de créer cette string moi-même chaque fois que j'en ai besoin.

Je pensais que je pourrais l'append à l'entité avec une class partielle comme ceci:

public ssortingng SpecialField { get { return ssortingng.Format("{0}-{1}-{2}-{3}-{4}-{5}-{6}", TableId, Number, ForeignTableA.Date, ForeignTableB.Name, ForeignTableC.ForeignTableD.Name, ForeignTableB.ForeignTableE.Name, ForeignTableB.Number ?? 0); } } 

Cependant, après avoir écrit cela, je suis devenu un peu incertain comment cela fonctionnerait. Car, à less que je ne me trompe, cela entraînerait une requête de database chaque fois que cette valeur est utilisée pour chaque élément. Et cela fonctionnerait-il par exemple pour utiliser ce champ dans une clause Where?

J'ai besoin d'utiliser ce champ dans une clause Where, et je voudrais que cela se produise au server afin que je ne récupère pas plus de données que nécessaire.

Comment feriez-vous mieux de faire cela?

Vous pouvez créer une vue dans la database pour cela pour vous. De cette manière, SQL Server s'en charge et vous pouvez effectuer des requêtes plus efficacement.

Je pense que vous aurez besoin d'une clause let avec une pincée de types anonymes. Je n'ai pas testé cela, mais quelque chose comme ça pourrait faire l'affaire:

 var query = from master in MasterTable join foreignA in ForeignTableA on ... join foreignB in ForeignTableB on ... let special = ssortingng.Format ("...", master.TableID, ...) where special.Contains ("foo") select { // ... ssortingng specialResult = special, // ... } 

Que diriez-vous de mettre en cache la valeur après l'avoir lu une fois? Ce ne sera pas ultra-efficace comme ce serait le cas si vous obteniez toutes ces valeurs à la fois, mais cela empêcherait plusieurs tentatives d'get la même valeur. (Bien sûr, cela ne fonctionne que si le contenu de SpecialField ne change pas en cours d'utilisation.)

 protected ssortingng specialField = null; public ssortingng SpecialField { get { if (specialField == null) { specialField = ssortingng.Format("{0}-{1}-{2}-{3}-{4}-{5}-{6}", TableId, Number, ForeignTableA.Date, ForeignTableB.Name, ForeignTableC.ForeignTableD.Name, ForeignTableB.ForeignTableE.Name, ForeignTableB.Number ?? 0); } return specialField; } }