【问题标题】:how to do a contains on an array of strings?如何对字符串数组进行包含?
【发布时间】:2013-06-14 07:31:00
【问题描述】:

我正在使用谓词构建器类,我需要在字符串数组上调用 contains 方法,因此在下面的代码中而不是无线电中,我将传入一个字符串数组:

wherePredicate = wherePredicate.Or(m => m.MediaType.Contains("Radio"));

完整的代码部分:

if (param.iMediaGroupID > 0)
{
    var wherePredicate = PredicateBuilder.False<MediaChannelModel>();

    var ss = new NeptuneRepository<Lookup_MediaTypes>();
    var mediagroups = ss.FindWhere(m => m.MediaGroupID == param.iMediaGroupID).Select(m => m.Name);
    //problem area
    wherePredicate = wherePredicate.Or(m => mediagroups.Contains(m.MediaType));
    predicate = predicate.And(wherePredicate);
}

mediaGroups 是:["Radio","Tv","Magazine"]

如果m.MediaType 是这些值中的任何一个,则谓词为真。

有没有办法在 C# 中做到这一点?

【问题讨论】:

  • 您想知道 MediaType 是否是字符串数组的一部分?这是正确的吗?
  • 这可能会给你一个提示:stackoverflow.com/questions/2912476/…
  • 不就是m =&gt; mediaGroups.Any(g =&gt; m.MediaType == g)

标签: c# linq predicatebuilder


【解决方案1】:

我怀疑你想要类似的东西:

wherePredicate = wherePredicate.Or(m => array.Contains(m.MediaType));

或许:

wherePredicate = wherePredicate.Or(m => array.Any(x => m.MediaType.Contains(x)));

如果这些都不是您所追求的,请说明您的要求。

编辑:您现在面临的问题是您并没有实际上询问数组是否包含该值。您是在询问 query 是否包含值。如果将其更改为实际数组,您可能会发现它有效:

var mediagroups = ss.FindWhere(m => m.MediaGroupID == param.iMediaGroupID)
                    .Select(m => m.Name)
                    .ToArray();

但是,如果它们查询的是同一个数据库,您最好尝试在某种连接中执行此操作。

【讨论】:

  • 乔恩,这里的 Or 方法是什么?是BitArray.Or 吗?
  • @SonerGönül:不,它可能是 OP 已经在使用的 PredicateBuilder 类。
  • 嗨,我收到此错误:“指定的 linq 表达式包含对具有不同上下文的查询的引用”,我还包括了整个问题部分。
  • 嗨乔恩,你能帮我把这两个包含方法转换为一个连接吗,这目前会导致超时异常,因为 EF5 中的包含太慢了。我已将表格结构包含在已编辑的问题中。
  • @xerxes:老实说,我认为最好就此提出一个新问题。
【解决方案2】:

Jon Skeet 的回答对我来说非常有效。我一直在努力使 .Contains 在字符串数组中针对数据库搜索子字符串,而不是尝试在单个 C# 字符串对象中查找子字符串。谢谢!

这是对我有用的修改后的代码:

var predicate = PredicateBuilder.False<ClientXMemberDetail>();
predicate = predicate.Or(x => strArrselectedCustomMemberNumbers.Any<string>(y => x.MemberID.Contains(y)));
CustomSearchMembersAlreadyMatched = ClientXContext.ClientXMemberDetails
                        .AsExpandable()
                            .Where(predicate)
                            .ToList()
                            .Select(r => r.MemberID.ToString()).ToList();

(上面ClientXContext是ObjectContext类的实例,strArrselectedCustomMemberNumbers是字符串数组,ClientXMemberDetails是ObjectSet,其中ClientXMemberDetail是EntityObject)

编辑:匿名化我的客户姓名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2011-07-23
    • 2019-05-26
    相关资源
    最近更新 更多