J'ai une situation où je dois construire dynamiquement une requête linq basée sur les sélections de l'utilisateur. Si je devais générer dynamiquement sql je pouvais le faire de cette façon:SubSonic 3, construction dynamique ou expression au moment de l'exécution
var sb = new StringBuilder();
sb.AppendLine("SELECT * FROM products p");
sb.AppendLine("WHERE p.CategoryId > 5");
// these variables are not static but choosen by the user
var type1 = true;
var type2 = true;
var type3 = false;
string type1expression = null;
string type2expression = null;
string type3expression = null;
if (type1)
type1expression = "p.productType1 = true";
if (type2)
type2expression = "p.productType2 = true";
if (type3)
type3expression = "p.productType3 = true";
string orexpression = String.Empty;
foreach(var expression in new List<string>
{type1expression, type2expression, type3expression})
{
if (!String.IsNullOrEmpty(orexpression) &&
!String.IsNullOrEmpty(expression))
orexpression += " OR ";
orexpression += expression;
}
if (!String.IsNullOrEmpty(orexpression))
{
sb.AppendLine("AND (");
sb.AppendLine(orexpression);
sb.AppendLine(")");
}
// result:
// SELECT * FROM products p
// WHERE p.CategoryId > 5
// AND (
// p.productType1 = true OR p.productType2 = true
//)
Maintenant, je dois créer une requête LINQ de la même manière.
Cela fonctionne bien avec subsonique
var result = from p in db.products
where p.productType1 == true || p.productType2 == true
select p;
Je l'ai essayé avec PredicateBuilder http://www.albahari.com/nutshell/predicatebuilder.aspx mais qui jette une exception avec subsonique.
var query = from p in db.products
select p;
var inner = PredicateBuilder.False<product>();
inner = inner.Or(p => p.productType1 == true);
inner = inner.Or(p => p.productType2 == true);
var result = query.Where(inner);
l'exception qui est levée: NotSupportedException: The member 'productType1' is not supported
à SubSonic.DataProviders.MySQL.MySqlFormatter.VisitMemberAccess
.
Tout le monde a une idée comment obtenir cette requête au travail:
salut SchlaWeiner, je construis aussi mes requêtes comme vous le faites. J'utilise généralement ceci pour le filtrage, le tri et la pagination. Avez-vous une manière élégante de faire ceci? –
J'ai ajouté un exemple. Suivez simplement le lien fourni par Devart, téléchargez l'exemple de projet et ajoutez le fichier Dynamic.cs à votre projet. Vous devez ajouter 'using System.Linq.Dynamic' à votre code afin d'utiliser la lib. –