【问题标题】:Linq with String Array Contains带有字符串数组的 Linq 包含
【发布时间】:2015-07-01 09:03:16
【问题描述】:

我有一个字符串数组和一个数据库对象列表,我想从中进行选择查询

List<string> target_terms = new List<string> { "car", "mechanic" }

if (isNotExactPhrase)
{
    List<int> _tagIds = (from item in dbContext.Tags
                    where target_terms.Any(w => item.TagName.Contains(w))
                    select item.TagId).ToList();
}

我想要数组中所有名称的标签

我必须使用 2 个选项我想检查标记名是否包含任何关键字 & 如果搜索的是确切的短语,那么我想检查任何标记名 == 任何关键字

但是对于这个查询我得到了错误

在查询的 LINQ to SQL 实现中不能使用本地序列 除包含运算符外的运算符。

如何解决?

【问题讨论】:

标签: c# arrays linq linq-to-sql


【解决方案1】:

试试这个查询

var _tagIds = (from item in dbContext.Tags
                    where keywords.contains(item.TagName)
                    select item.TagId).ToList();

没有直接的等价物,但有些方法的工作方式类似,具体取决于模式。

string.Contains("pattern") 等价于 LIKE '%pattern%'

string.StartsWith("pattern") 等价于 LIKE 'pattern%'

string.EndsWith("pattern") 等价于 LIKE '%pattern'

【讨论】:

  • 这个有效,但是当我尝试使用另一个带有此 _tagIds 的 Linq Qury 时,它显示相同的错误
  • 现在检查返回的内容。
  • 我该怎么做第二种情况。而不是使用 contains 我如何检查 == 。因为如果用户搜索“car”并且如果存在带有单词“carmel”的标签,那么该项目也将被包含
  • 作者尝试通过子字符串比较标签。那不是答案。 (作者案例:tag = "super_code", keyword = "er_co" ...您的查询将不会返回结果)。
【解决方案2】:

在多次遇到这个问题后,我创建了一个nuget package 来解决这个常见问题。

使用NinjaNye.SearchExtensions,您可以执行以下操作:

var _tagIds = dbContext.Tags.Search(t => t.TagName)
                            .Containing(keywords)
                            .Select(t => t.TagId)
                            .ToList();

如果需要,您还可以搜索多个属性并返回在任一属性中找到匹配项的记录。

var _tagIds = dbContext.Tags.Search(t => t.TagName, t => t.Description)
                            .Containing(keywords)
                            .Select(t => t.TagId)
                            .ToList();

希望对你有帮助

【讨论】:

    【解决方案3】:

    尝试将Any 替换为contains

    List<int> _tagIds = (from item in dbContext.Tags
                        where target_terms.Contains(w => item.TagName.Contains(w))
                        select item.TagId).ToList();
    

    【讨论】:

    • 如果您使用的是 target_terms.contains,我认为 Second contains 不应该存在
    猜你喜欢
    • 2010-12-17
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    相关资源
    最近更新 更多