Domanda

Sto provando a creare un'istruzione Linq che interroga sia le colonne esistenti sulla mia entità come proprietà sia quelle che non esistono come colonne nel database per l'entità.

Ad esempio, ho una raccolta di entità Book. Ogni libro ha una proprietà ID e titolo e una colonna corrispondente nel database. Tuttavia, supponiamo che la tabella per Book contenga anche un campo colonna per Autore e che la mia entità Book non abbia questo.

Una normale query che coinvolge l'ID e il titolo potrebbe apparire così:

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

Ma voglio anche aggiungere dinamicamente l'equivalente di " AND Author = 'Name' " anche alla query sopra. La proprietà Author non esiste sull'oggetto Book.

I campi extra e i valori che devono contenere saranno effettivamente disponibili in un dizionario. Quindi dovrò aggiungere dinamicamente più AND [FieldName] = '[Value]' alla query.

Potrebbe aiutare a spiegare perché avrei bisogno di questo per sapere che sto usando Archiviazione tabelle di Azure e ho ignorato la serializzazione che trasforma un'entità Book nell'XML archiviato in Azure.

Modifica -

Ho provato ad usare la libreria Dynamic Linq ma non funziona.

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

Produce: System.Linq.Dynamic.ParseException: nessuna proprietà o campo "Autore" esiste nel tipo "Libro".

Inoltre,

So di usare Books.AddQueryOption (" $ filter ", " Author eq 'SomeName' ") funziona se usato da solo. Ma non ho idea di come utilizzare AddQueryOption insieme a un'istruzione Where esistente.

È stato utile?

Soluzione 2

Questo non è possibile con LINQ

Altri suggerimenti

Senza aggiungere Autore a Libro, dovresti passare un altro oggetto con Autore su di esso:

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

O eredita da Book e aggiungi una proprietà Author solo per questo scopo:

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

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

Prova il seguente codice:

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

Questo è un metodo di estensione per il tipo IQueryable :

public static IQueryable Cast(this IQueryable source, string type)
{
    switch (type)
    {
        case "TofiDataCollection.Service.TofiEntity.Obj":
            return source.Cast<Obj>();
    }
    return source;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top