Quando scrivo un metodo per un servizio oData ho il seguente linq, per il quale ho bisogno di una clausola dinamica "where" per filtrare i risultati (i "nuovi" nei join sono per PK compositi nel modello di dati di entità):
var query = from pl in CurrentDataSource.ProductListing
join pla in CurrentDataSource.ProductListingAttribute
on new {pl.ProductID, pl.WebCategoryID, pl.ParentProductID}
equals new {pla.ProductID, pla.WebCategoryID, pla.ParentProductID}
join att in CurrentDataSource.Attribute
on pla.AttributeID
equals att.AttributeID
join attItem in CurrentDataSource.AttributeItem
on pla.AttributeItemID
equals attItem.AttributeItemID
select pl;
Il mio Linq non è molto buono e sto cercando di utilizzare la classe DynamicQueryable per generare una clausola "where" in fase di esecuzione (è costruita da varie variabili):
var returnData = query.Where(whereClause);
Poiché la clausola "where" filtra i valori nelle entità Attribute e AttributeItem, contiene invariabilmente cose come
"((Attribute.Value='foo' AND AttributeItem.Value='bar')
OR
(Attribute.Value='sna' AND AttributeItem.Value='fu'))"
che fallirà in fase di esecuzione poiché "Non esiste alcuna proprietà o campo" Attributo "nel tipo" Elenco prodotti ".
Ho provato a creare un tipo anonimo nella "selezione" che contiene tutti gli elementi dell'entità ProductListing e quelli di Attribute e AttributeItem per i quali devo filtrare, ma ho bisogno di un'entità fortemente tipizzata di tipo "ProductListing" per tornare dal metodo chiamata.
Qualcuno può aiutare, per favore?? Dovrei usare i join dinamici anziché quelli dinamici? Esiste un modo per dire dove contro entità che non stai selezionando? Dovrei selezionare un tipo / "let" anonimo e costruire successivamente un'entità fortemente tipizzata?
Per favore, qualsiasi aiuto è molto apprezzato.
rposbo
La soluzione alla mia domanda particolare era di fare questo:
var query = from pl in CurrentDataSource.ProductListing
join pla in CurrentDataSource.ProductListingAttribute
on new {pl.ProductID, pl.WebCategoryID, pl.ParentProductID}
equals new {pla.ProductID, pla.WebCategoryID, pla.ParentProductID}
join att in CurrentDataSource.Attribute
on pla.AttributeID
equals att.AttributeID
join attItem in CurrentDataSource.AttributeItem
on pla.AttributeItemID
equals attItem.AttributeItemID
select new
{
ProductListing = pl,
att.AttributeName,
attItem.AttributeValue
};
var returnData = query.Where(whereClause).Select(o => o.ProductListing);
cioè, selezionare un tipo anonimo contenente un tipo concreto, applicare la clausola where a quella quindi selezionare solo il tipo concreto dal risultato.