LINQ搜索多列

5

我想使用linq-to-sql在多列中搜索字符串,我想知道如何编写where子句。我的做法是:我将要搜索的ID列表以及搜索词都传递进去:

public List<long> Seach(string TheSearchTerm, List<long> TheIDs)
{

using (SomeDataContext TheDC = new SomeDataContext())
{
    var TheOutput = (from t in TheDC.SomeTable

                     where TheIDs.Contains(t.ID) &&
                      where "TheSearchTerm is in one of the columns"

                     select t.ID).ToList();
    }
}

我该如何编写第二个where子句以搜索所有列?我考虑了为每列编写一个where子句,但我想知道是否有更好的方法。

谢谢。

2个回答

9
var TheOutput = (from t in TheDC.SomeTable

                 where TheIDs.Contains(t.ID) && (
                 t.column1.Contains(TheSearchTerm) ||
                 t.column2.Contains(TheSearchTerm) ||
                 t.column3.Contains(TheSearchTerm) )           
                 select t.ID).ToList();
}

您只应该有一个where子句,并使用||将所有列的检查组合起来。

有没有不需要显式包含列名的方法? - frenchie
不要使用纯linq-to-sql。但是,您可以创建一个存储过程来搜索所有字符类型列,然后从L2S上下文中调用该SP。 - Anders Abel
这不是一个理想的搜索。假设您有作者和标题列。Steven King,The Shining不会响应搜索词“King Shining”,但您可能希望它这样做。 - Michael G

7

我有一个名为SearchExtensions的NuGet包,可以解决这个问题:

var result = TheDC.SomeTable.Search(t => t.Id).EqualTo(TheIDs)
                            .Search(t => t.Column1, t => t.Column2, t => t.Column3)
                            .Containing(TheSearchTerm)
                            .Select(t => t.ID).ToList();

另外,如果您想搜索所有字符串属性,则可以执行以下操作:

var result = TheDC.SomeTable.Search(t => t.Id).EqualTo(TheIDs)
                            .Search().Containing(TheSearchTerm)
                            .Select(t => t.ID).ToList();

这两种方法都会创建表达式树,以向SQL服务器发送正确的指令,从而仅返回与之匹配的记录。

1
太棒了!它解决了我的问题。我正在寻找从多个列中进行排名搜索。 - habib
非常好的包。是否有一种方法可以搜索所有列?就像使用 table.Search().Containing(Keyword) 但也适用于非字符串列(例如数字)。 - Isu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接