controllare questo articolo a fare ciò che si vuole:
http://www.albahari.com/nutshell/predicatebuilder.aspx
Questo funziona come un sogno. I sostanzialmente tagliato e incollato il loro codice e ottenuto questo posteriore (con la mia tecnica d'schema ovviamente):
SELECT [t0].[Id], [t0].[DateCreated], [t0].[Name] ...
FROM [dbo].[Companies] AS [t0]
WHERE ([t0].[Name] LIKE @p0) OR ([t0].[Name] LIKE @p1)
Ecco il codice mi sono imbattuto per la prova di concetto:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
namespace PredicateTest
{
class Program
{
static void Main(string[] args)
{
DataClasses1DataContext dataContext = new DataClasses1DataContext();
Program p = new Program();
Program.SearchCompanies("test", "test2");
var pr = from pi in dataContext.Companies.Where(Program.SearchCompanies("test", "test2")) select pi;
}
DataClasses1DataContext dataContext = new DataClasses1DataContext();
public static Expression<Func<Company, bool>> SearchCompanies(
params string[] keywords)
{
var predicate = PredicateBuilder.False<Company>();
foreach (string keyword in keywords)
{
string temp = keyword;
predicate = predicate.Or(p => p.Name.Contains(temp));
}
return predicate;
}
}
public static class PredicateBuilder
{
public static Expression<Func<T, bool>> True<T>() { return f => true; }
public static Expression<Func<T, bool>> False<T>() { return f => false; }
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
}
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
}
}
}
I' d suggerisco di andare sul sito per il codice e la spiegazione.
(lascio la prima risposta perché funziona bene se avete bisogno di una dichiarazione IN)
fonte
2009-02-06 15:49:18
Che certo dovrebbe funzionare –
Grazie per l'idea Matthew, ma che genera il seguente SQL:.. SELECT [t0] [Testo] FROM [dbo] [Tabella] AS [T0] WHERE [T0 ]. [Testo] IN (@ p0) Cerca la colonna di testo in ogni elemento dell'array piuttosto che cercare ogni elemento dell'array nella colonna di testo. – bjallen