2009-02-04 5 views
7

변수 개수가 <string입니다. LINQ를 통해 테이블을 쿼리하여 텍스트 열에 해당 문자열이 포함 된 항목을 찾으려고합니다.LINQ to SQL - 문자열 배열과 같은 텍스트 배열을 선택하십시오.

이 (작동하지 않습니다) 시도 :

items = from dbt in database.Items 
     where (stringList.FindAll(s => dbt.Text.Contains(s)).Count > 0) 
     select dbt; 

쿼리 같은 것 :

select * from items where text like '%string1%' or text like '%string2%' 

이 가능합니까?

답변

11

확인이 기사를 아웃 :

string[] items = new string[] { "a", "b", "c", "d" }; 

var items = from i in db.Items 
      where items.Contains(p.text) 
      select i; 

은 알았어요. 나는 기본적으로 잘라 자신의 코드를 붙여 넣기하고 (물론 내 자신의 데이터 구성표)이 돌아왔다 : 나는 '

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); 
    } 
} 
} 

:

여기
SELECT [t0].[Id], [t0].[DateCreated], [t0].[Name] ... 
FROM [dbo].[Companies] AS [t0] 
WHERE ([t0].[Name] LIKE @p0) OR ([t0].[Name] LIKE @p1) 

내가 개념의 증명을 위해 실행 된 코드입니다 d는 코드와 설명을 위해 사이트에 갈 것을 제안합니다. 당신과 같은 솔루션을 찾고,이 게시물을 읽고 나면

6

SQL 게임 전체에 새로운 LINQ 종류가 있지만이 구문이 도움이됩니까?
http://www.albahari.com/nutshell/predicatebuilder.aspx

이 꿈처럼 작동 : 당신이 원하는 것을 할

http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/

+0

:. SELECT [T0] [텍스트] [DBO] FROM [표] AS [T0] WHERE [T0 ]. [Text] IN (@ p0) 텍스트 열의 각 배열 항목을 찾기보다는 배열의 각 항목에서 텍스트 열을 찾고 있습니다. –

+3

감사를 작동해야하지만 그 다음 SQL을 생성하는210

public static IQueryable<T> Search<T>(this IQueryable<T> source, Expression<Func<T, string>> selector, string s) { if (string.IsNullOrEmpty(s)) return source; string[] str = s.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries); MethodInfo methodContains = typeof(string).GetMethod("Contains", new[] { typeof(string) }); Expression strExpression; Expression expressionContains; Expression resultExpression = Expression.Empty(); for (int i = 0; i < str.Length; i++) { strExpression = Expression.Constant(str[i].Trim(), typeof(string)); expressionContains = Expression.Call(selector.Body, methodContains, strExpression); if (i == 0) resultExpression = expressionContains; else resultExpression = Expression.OrElse(resultExpression, expressionContains); } Expression<Func<T, bool>> lambdaExpr = Expression.Lambda<Func<T, bool>>(resultExpression, new ParameterExpression[] { selector.Parameters[0] }); return source.Where(lambdaExpr); } 
bjallen

1

(당신이 IN 문을 필요한 경우에 잘 작동하기 때문에 나는 첫 번째 대답을 떠납니다), 나는 .Any.All 메소드를 사용하여 해결책을 발견 Linq는 배열에 대해 일치하는 결과를 얻는 간단하고 우아한 좋은 방법입니다.

이 예에서는 검색 입력을 쉼표로 구분하여 사용하고 있습니다. 경기가 같은 경우가 아닌지 상관 없습니다.

var qry = Query.Split(',').Select(c => c.Trim().ToLower()); 

우선 몇 가지 데이터가 두 이름으로 조회에 .Any 문자열 경기에서 Linq에에서 좋은 꽉 코드에 대한 람다 구문을 사용하여 SQL 또는 어디든지

var search = db.tablename; 

에, 쿼리 및 결과를 가져 오기 또는 표의 설명.

search = search.Where(
    record => 
    qry.Any(q => record.Name.ToLower().Contains(q)) || 
    qry.Any(q => record.Description.ToLower().Contains(q))); 

모든 문자열이 어떤 분야 내에서 일치하는 결과 만 원하는 경우에 당신은 .All.Any을 대체 할 수

search = search.Where(
    record => 
    qry.All(q => record.Name.ToLower().Contains(q)) || 
    qry.All(q => record.Description.ToLower().Contains(q))); 
0

사용 :

string searh = "test1 test2,test3";  
data.Persons.Search(p => p.Name, search); 

검색 기능은 다음과 같습니다

. 확인 아이디어 마태 복음에 대한