5

我正在使用 LINQ 在单个短语上搜索多个字段,并且我正在使用Contains()它来执行此操作。直到今天,当我注意到 find 方法无法正常工作时。

所以我希望能够搜索每个匹配的字段。我已经在 Google 上和通过 SO 进行了一些搜索,并找到了使用的建议Any()?有没有人有什么建议?

var l = _getData().Select(_marshallData).ToList();
            return l.Where(x => x.Name.Contains(what) || x.Pumpkin.Contains(what) || x.Orange.Contains(what) || x.Tomato.Contains(what)).ToList();

请原谅愚蠢的字段名称,我不得不更改它们以保密。

4

1 回答 1

12

由于您已经在物化数据,因此您可以这样做:

var l = _getData().Select(_marshallData).AsEnumerable();
return l.Where(x => new[] { x.Name, x.Pumpkin, x.Orange, x.Tomato }.Any(s => s.Contains(what)));

但是,如果您使用的是 ORM(如 Entity Framework),则此技巧可能不起作用(因为很有可能无法将其转换为 SQL 表达式)。在这种情况下,您的原始解决方案很好,但在具体化数据之前执行此操作可能会更好。

return _getData()
    .Where(x => 
        x.Name.Contains(what) || x.Pumpkin.Contains(what) || 
        x.Orange.Contains(what) || x.Tomato.Contains(what))
    .Select(_marshallData)
    .AsEnumerable();

当然这里的字段名称可能不同,因为参数x可能是不同的类型。如果没有更多信息,您可以正确编写此过滤器。

请注意,在这两个示例中,我已经消除了对ToList. 除非您绝对需要结果,否则List<T>这可能是不必要的。

于 2013-06-07T22:54:09.860 回答