2009-02-04 20 views
7

gibi bir dizinin seçildiği bir sayının <string> değişken sayımı var ve Metin sütununda bu dizelerden herhangi birini içeren öğeleri bulmak için bir tabloyu (LINQ aracılığıyla) sorgulamak istiyorum.LINQ to SQL - dize dizisi

bu (çalışmıyor), denedim:

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

Sorgu gibi bir şey olacaktır:

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

bu mümkün mü?

cevap

11

kontrol edin bu makaleyi:

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

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

dan aldım. Ben esasen kesilmiş ve bunların kod yapıştırılan ve (elbette kendi veri düzeni ile) geri aldım: Ben

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

:

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

Ben anlayış için kanıt ran kodudur d kod ve açıklama için siteye gitmenizi öneririm. Sizinle aynı çözüm arayan, bu yazıyı okuduktan sonra

6

Tüm LINQ to SQL oyununa yeni bir tür, ancak bu sözdizimi yardımı yapıyor mu?
http://www.albahari.com/nutshell/predicatebuilder.aspx

Bu bir rüya gibi çalışır: Ne istediğinizi yapmak

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

+0

. SEÇ [t0] [Metin] [dbo] GELEN [Tablo] AS [t0] NEREDE [t0 [Metin] IN (@ p0) Bu, metin sütunundaki dizinin her bir öğesini aramak yerine dizinin her öğesindeki metin sütununu arar. –

+3

Teşekkür çalışması gerektiğini, ama bu şu SQL oluşturur Yani 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

(Eğer bir IN deyimi gerek işe yarar çünkü ilk cevabı ayrılıyorum), ben .Any ve .All yöntemler kullanılarak bir çözüm buldu Linq diziler için sonuçları eşleştirmenin güzel ve basit bir yoludur.

Bu örnekte, örnek olarak virgülle ayrılmış bir arama girişi kullanıyorum. Maçın aynı durumda olmaması umurumda değil.

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

İlk bazı veriler ya isme sorguda .Any dizeye maçta Linq güzel sıkı kodu için lambda sözdizimi kullanarak SQL veya nerede

var search = db.tablename; 

için, sorgulamak ve sonuçlanma alın veya tabloda açıklama.

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

tüm dizeleri herhangi bir alanda içinde eşleştirildiği tek sonuç istiyorsanız .All ile .Any değiştirebilirsiniz:

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

kullanma:

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

Arama fonksiyonudur:

. Emin fikri Matthew için