当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《LINQtoSQL-选择字符串数组之类的文本》经验,为你挑选了2个好方法。

我有一个List > of variable count,我想查询(通过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%'

这可能吗?



1> Matthew Doyl..:

查看这篇文章,做你想做的事:
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> SearchCompanies(
                                                  params string[] keywords)
    {
        var predicate = PredicateBuilder.False();
        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> True() { return f => true; }
    public static Expression> False() { return f => false; }

    public static Expression> Or(this Expression> expr1,
                                                        Expression> expr2)
    {
        var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast());
        return Expression.Lambda>
              (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
    }

    public static Expression> And(this Expression> expr1,
                                                         Expression> expr2)
    {
        var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast());
        return Expression.Lambda>
              (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
    }
}
}

我建议去网站查看代码和解释.

(我要留下第一个答案,因为如果你需要一个IN声明它会很好用)



2> Matthew Doyl..:

整个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/


感谢Matthew的想法,但是生成了以下SQL:SELECT [t0].[Text] FROM [dbo].[Table] AS [t0] WHERE [t0].[Text] IN(@ p0)它正在寻找数组的每个项目中的文本列,而不是在文本列中查找数组的每个项目.
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有