|
我有一个,我想查询(通过LINQ)一个表以查找包含“文本”列中任何这些字符串的任何项目。0 |" P/ `* F$ r1 f9 D2 B
尝试过此操作(无效):% m* l0 e! S/ g
items = from dbt in database.Items: v5 D. i$ Y- s1 |- y# A8 M
where (stringList.FindAll(s => dbt.Text.Contains(s)).Count > 0)
: w7 Q& Y4 B* X! [" O% d. ]: `2 K) L select dbt;8 w. G( H: E: U6 Y1 |2 h. r9 Q3 U6 W/ q
查询将类似于:
! ]6 j6 P+ l. P$ s* z& g; ^select * from items where text like '%string1%' or text like '%string2%'& e* S/ O" G+ d( n" B' ?" O! ~
这可能吗?
& v5 K$ b! m. R9 P8 I
* A: J/ d5 @; g8 G& H. A0 L, J6 J解决方案:$ j* r- z4 ?# {5 q" ^
% V: z, b6 S' r+ T6 M
2 L5 M# { t& M1 \
@0 }3 t$ F2 H 查看本文以执行所需的操作:
' G( m& S5 k/ G) G/ d- Q6 @http :! M* r ? U& ?3 }
//www.albahari.com/nutshell/predicatebuilder.aspx 7 q+ V* _: R7 h4 O/ d! ~$ Q4 J/ [$ y
这就像梦一样。我实质上是剪切并粘贴了他们的代码,然后将其取回来(当然是用我自己的数据方案):. Z9 m3 |9 F. b4 p W
SELECT [t0].[Id], [t0].[DateCreated], [t0].[Name] ..." O- a" W; j( H' f: k; C
FROM [dbo].[Companies] AS [t0]9 l0 q( E5 z; V0 B( _% C
WHERE ([t0].[Name] LIKE @p0) OR ([t0].[Name] LIKE @p1)8 Y; x0 ?& a! J+ k7 r
这是我为概念验证而运行的代码:: X8 Q( u& T) D
using System;
, A% K. i* J4 t8 I2 ]! `5 uusing System.Collections.Generic;6 s( y) j; Z3 m m2 m
using System.Linq;
+ ^3 v& V' c% X! C/ H, C$ n* N! ~using System.Text;1 j" _1 r! @8 M: E' F% {
using System.Linq.Expressions; I# d3 M9 ^- Z3 ]: d
namespace PredicateTest
7 g. u- T' c* e8 b Z9 W{( A3 @+ Q) _% [( ` T2 |! Q) c$ O( u
class Program
% t2 l2 ?5 _) _& a* ]6 D& Z2 U: Z{
2 C$ b: L; L& ~- C* {+ A) }( i& ?5 o static void Main(string[] args)
, [- L5 c* p7 Z+ x7 |% D {
+ e3 O7 ^5 z/ R" `4 D/ F1 F DataClasses1DataContext dataContext = new DataClasses1DataContext();) f9 V! p# V) H) D* M7 v' h
Program p = new Program();' `9 I/ R V3 V( z* ]
Program.SearchCompanies("test", "test2");
% I& C( P2 {& g" R9 z var pr = from pi in dataContext.Companies.Where(Program.SearchCompanies("test", "test2")) select pi;* Z2 V7 @5 U7 K# l; i" T3 {. S& w
}
6 q7 X+ E+ l" T/ { DataClasses1DataContext dataContext = new DataClasses1DataContext();+ p q& M: V4 C. d# g! P
public static Expression> SearchCompanies(
, o9 M+ Y1 T$ a" C( E params string[] keywords)2 u0 {0 G; v, c R1 G) H
{3 P% f2 P8 m$ V+ U5 U" L
var predicate = PredicateBuilder.False();! S5 m: y6 b7 n# X' [
foreach (string keyword in keywords)- | b9 i! q7 L, s; r* h ~
{
: o) N$ J8 `' X* Q5 ]) {2 O string temp = keyword;
0 K" C9 E6 t! o+ C2 u. f predicate = predicate.Or(p => p.Name.Contains(temp));
* }+ K% T3 c9 n8 b$ _3 h7 o: R }
3 K' e `. k) u" a# a! U1 D! A return predicate;
& Y5 F( n; V7 J- t, j }
7 Y; _; K( m/ d% H5 V}+ R( L- R2 ]' [' G5 w) c
public static class PredicateBuilder% n, o: B" C: v2 g# s, D; u
{
( i* {- v$ g* B. ` public static Expression> True() { return f => true; }8 B7 C' g H2 ]9 S9 C
public static Expression> False() { return f => false; }
S2 k4 H) n2 p3 K public static Expression> Or(this Expression> expr1,
9 j( p4 t2 V6 R% I5 x" I Expression> expr2)
3 G e: M7 L& g4 D1 S, Y {
: y/ g3 n! ^- F var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast());
1 L" T' F% u5 a: ]4 n2 v0 X return Expression.Lambda>
; K2 F0 [! N) x1 Y (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
' U b0 V; b7 k+ R a Z, R& q5 O }
5 p9 C2 A L/ y9 c: K public static Expression> And(this Expression> expr1, O/ S! r* H$ r1 U
Expression> expr2)
* [6 R, h: }& P+ k0 E {! S# N) J7 P9 u% [( k7 }7 N
var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast());
- S& x/ j) ^/ ]# \4 y- M return Expression.Lambda>
9 c. Q! M2 @# S& Q- Y" s8 K% L( u (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);/ ]* G# k3 g: m" X, w: m
}
3 s; S7 { a6 x1 i}0 |" @& Q- c" H% Y1 p% A3 r
}
7 r1 z P9 Z f; N我建议去该网站获取代码和解释。; I9 Q1 k' ^0 ~' F7 D& e3 G# \. q
(我留下第一个答案,因为如果您需要一个IN语句,它会很好地工作) |
|