【问题标题】:LINQ: Remove items from IQueryableLINQ:从 IQueryable 中删除项目
【发布时间】:2010-10-17 12:07:48
【问题描述】:

我想先从 LINQ 查询的结果中删除一个项目,然后再将其用于数据绑定。这样做的正确方法是什么?

我插图中的 foreach 是我的问题的主题。插图:

var obj =
    (from a in dc.Activities
    where a.Referrer != null
    && a.Referrer.Trim().Length > 12
    && a.Session.IP.NumProblems == 0
    && (a.Session.UID == null || a.Session.UID < 1 || a.Session.User.BanLevel < 1)
    select a)
    .Take(int.Parse(ConfigurationManager.AppSettings["RecentItemQty"]));
foreach (Activity act in obj)
    if (isDomainBlacklisted(ref dc, act.Referrer))
        obj.Remove(act);

【问题讨论】:

    标签: c# linq linq-to-sql collections iterator


    【解决方案1】:

    你不需要 foreach 你可以使用它...

    obj.RemoveAll(act => isDomainBlackListed(ref dc, act.Referrer));
    

    【讨论】:

      【解决方案2】:

      您可以将其放在查询的末尾,以便在它们最终出现在结果之前将它们过滤掉:

      var obj =
         (from a in dc.Activities
         where a.Referrer != null
         && a.Referrer.Trim().Length > 12
         && a.Session.IP.NumProblems == 0
         && (a.Session.UID == null || a.Session.UID < 1 || a.Session.User.BanLevel < 1)
         select a)
         .Take(int.Parse(ConfigurationManager.AppSettings["RecentItemQty"]))
         .Where(a => !isDomainBlacklisted(ref dc, a.Referrer));
      

      如果您希望其他项目替换被过滤掉的项目,您可以将 Where 放在 Take 之前,但这当然意味着对 isDomainBlacklisted 的更多调用。

      【讨论】:

      • 是的,我就是这么做的。实际上我把它放在 datasource= 行中。
      猜你喜欢
      • 2021-05-12
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      相关资源
      最近更新 更多