7

変数カウントの List <string> があり、(LINQ 経由で) テーブルにクエリを実行して、Text 列にこれらの文字列のいずれかを含む項目を検索したいと考えています。

これを試しました(動作しません):

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%'

これは可能ですか?

4

4 に答える 4

11

この記事をチェックして、やりたいことを実行してください:
http://www.albahari.com/nutshell/predicatebuilder.aspx

これは夢のように機能します。私は本質的に彼らのコードをカットアンドペーストして、これを取り戻しました(もちろん、私自身のデータスキームを使用して):

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

概念実証のために実行したコードは次のとおりです。

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

コードと説明については、サイトにアクセスすることをお勧めします。

(INステートメントが必要な場合にうまく機能するため、最初の回答を残しています)

于 2009-02-06T15:49:18.053 に答える
6

LINQ to SQL ゲーム全体にとっては初めてのことですが、この構文は役に立ちますか?

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

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

から入手しました:

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

于 2009-02-04T17:15:29.287 に答える
1

この投稿を読んで、あなたと同じ解決策を探した後、Linqのメソッド.Anyとメソッドを使用した解決策が、配列の一致する結果を取得するためのシンプルでエレガントな方法であることがわかりました。.All

この例では、例としてコンマで区切られた検索入力を使用しています。一致が同じケースでなくてもかまいません。

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

まず、Linq から SQL まで、またはどこでもクエリを実行するデータを取得します。

var search = db.tablename;

適切なタイトなコードのラムダ構文を使用すると.Any、テーブル内の名前または説明のいずれかに対するクエリ内の文字列に一致します。

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

すべての文字列が任意のフィールド内で一致する結果のみが必要な場合は、次のように置き換えることができ.Anyます.All

search = search.Where(
    record => 
    qry.All(q => record.Name.ToLower().Contains(q)) || 
    qry.All(q => record.Description.ToLower().Contains(q)));
于 2011-06-30T14:25:53.537 に答える