回答

收藏

LINQ to SQL-选择字符串数组之类的文本

技术问答 技术问答 323 人阅读 | 0 人回复 | 2023-09-14

我有一个,我想查询(通过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语句,它会很好地工作)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则