Question

J'essaie de créer une instruction Linq qui interroge les colonnes qui existent sur mon entité en tant que propriétés et celles qui n'existent pas, mais qui existent sous forme de colonnes dans la base de données pour l'entité.

Par exemple, j'ai une collection d'entités Book. Chaque livre a une propriété ID et un titre et une colonne correspondante dans la base de données. Mais disons que la table pour Book contient également un champ de colonne pour Auteur et que mon entité Book ne l’a pas.

Une requête normale impliquant l'ID et le titre pourrait ressembler à ceci:

Books.Where(b=>b.ID == 123 && b.Title == "Title")

Mais, je souhaite également ajouter de manière dynamique l'équivalent de " AND Author = 'Nom' " à la requête ci-dessus aussi bien. La propriété Author n'existe pas dans l'objet Book.

Les champs supplémentaires et les valeurs qu’ils doivent contenir seront effectivement disponibles dans un dictionnaire. J'aurai donc besoin d'ajouter dynamiquement plusieurs AND [FieldName] = '[Valeur]' à la requête.

Cela pourrait aider à expliquer pourquoi j'en aurais besoin de savoir que j'utilise Azure Table Storage et que j'ai remplacé la sérialisation qui transforme une entité Book en XML stocké dans Azure.

Modifier -

J'ai essayé d'utiliser la bibliothèque Dynamic Linq mais cela ne fonctionne pas.

Books.Where(b=>b.ID == 123 && b.Title == "Title").Where("Author = @0", "SomeName").ToList();

Lance: System.Linq.Dynamic.ParseException: aucune propriété ni champ "Auteur" n'existe dans le type "Livre".

En outre,

Je sais utiliser Books.AddQueryOption ("$ filter", "Author eq 'SomeName" ") fonctionne lorsqu'il est utilisé seul. Mais je ne sais pas comment utiliser AddQueryOption avec une instruction Where existante.

Était-ce utile?

La solution 2

Cela n’est pas possible avec LINQ

Autres conseils

Sans ajouter auteur à livre, vous devrez soit passer un autre objet avec auteur dessus:

var x = new { Author="SomeName" };  
    Books.Where(b=>b.Id == 1 && b.Title == "Alpha").Where("@1.Author == @0", "SomeName", x);

Ou héritez de Book et ajoutez une propriété Author uniquement à cette fin:

public class BookEx : Book {
    public string Author { get; set; }
}

Books.Cast<BookEx>().Where(b=>b.Id == 1 && b.Title== "Alpha").Where("Author == @0", "SomeName");

Essayez le code suivant:

var result = _tofiObjectList.Where(o => o.GetType() == mainObjType)
    .AsQueryable().Cast(relation.MainObject.EntityType).Where(relation.MainObject.Filter);

Il s'agit d'une méthode d'extension pour le type IQueryable :

public static IQueryable Cast(this IQueryable source, string type)
{
    switch (type)
    {
        case "TofiDataCollection.Service.TofiEntity.Obj":
            return source.Cast<Obj>();
    }
    return source;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top