代码之家  ›  专栏  ›  技术社区  ›  tsilb

如何在字符串列表中选择/过滤子字符串?

  •  1
  • tsilb  · 技术社区  · 16 年前

    List<string> MyDomains = [Code to get list];
    
    var x = (from a in dc.Activities
        where a.Referrer != null
            && a.Referrer.Trim().Length > 0
            && !a.Referrer.Contains("localhost")
            && a.SearchResults.Count() == 0
        orderby a.ID descending
        select a)
        .Take(20);
    

    既然我已经解决了这个问题,让我更好地解释一下。MyDomains是一个字符串列表;每个都是我自己的根域。

    撇开架构上的分歧不谈,我如何在LINQ查询中实现这一点?


    2 回复  |  直到 16 年前
        1
  •  1
  •   Konamiman    16 年前

    如果我理解正确,您希望获得按ID排序的前20个活动,其Referrer字段不包含MyDomains中的任何项目作为子字符串。

    以下方法或类似方法应该有效:

    var theActivities = (from a in dc.Activities
        where a.Referrer != null
            && a.Referrer.Trim().Length > 0
            && a.SearchResults.Count() == 0
        select a);
    
    foreach(var domain in MyDomains) {
        theActivities = theActivities.Except(dc.Activities.Where(a => a.Referrer.Contains(domain)));
    }
    
    theActivities = theActivities.OrderBy(a => a.Id).Take(20);
    
    //Now you can query theActivities
    

    :事实上,这不起作用。由于查询表达式在实际查询时被计算,因此所有 Except domain

    var whereClauses=new List<string>();
    
    for(int i=0; i<MyDomains.Length; i++) {
        whereClauses.Add(string.Format("(Referrer like {{{0}}})", i));
    }
    
    var sqlFormattedDomains=MyDomains.Select(d => string.Format("%{0}%", d)).ToArray();
    
    var sqlCommand=string.Format(
        "select top 20 * from Activities where (not Referrer is null) and (not ({0})) order by Id",
        sqlFormattedDomains.Join(" or "));
    
    var x=dc.ExecuteQuery<Activities>(sqlCommand, sqlFormattedDomains);
    

    SearchResults.Count() == 0

        2
  •  0
  •   Murph    16 年前

    && !MyDomains.Contains(a.Referrer)