【问题标题】:Writing a method to be used as IQueryable编写一个用作 IQueryable 的方法
【发布时间】:2014-02-27 05:41:02
【问题描述】:

我正在尝试编写这个方法:

   public IQueryable<String> FilterIp(Boolean filter)
        {
            return filter ? ((IEnumerable<String>)_filterIp).Select(x => x).AsQueryable() : ((IEnumerable<String>)new String[0]).Select(x => x).AsQueryable();

        }
 String[] _filterIp = new[] { "191.16.95.133", "::1", "127.0.0.1" }; 

然后想像这样使用它:

.Where(ip => !FilterIp(filtered).Contains(ip)).ToList()

问题是我得到一个错误:

附加信息:LINQ to Entities 无法识别该方法 'System.Linq.IQueryable`1[System.String] FilterIp(Boolean)' 方法, 而且这个方法不能翻译成store表达式

【问题讨论】:

  • FilterIP 不是公认的 SQL 方法。所以你需要先把实体拉到本地。
  • 先将FilterIp(filtered) 的结果存储在一个变量中,然后在查询中使用该变量。
  • @GertArnold 谢谢,请发布答案以便我接受。

标签: c# linq lambda


【解决方案1】:

从技术上讲,这样做就足够了

var filterIp = filter 
                  ? new[] { "191.16.95.133", "::1", "127.0.0.1" }
                  : new string[0];

var query = <body>.Where(ip => !filterIp.Contains(ip));

但我不知道FilterIp() 是否在其他组件中。如果是这样,它包含上面的第一行代码就足够了。

如果filter 的值已知“接近”查询,您也可以这样做

IQueryable<YourClass> query = <body>;
if (filter)
    query = query.Where(ip => !filterIp.Contains(ip));

其中filterIp 只是 IP 地址数组。

【讨论】:

    【解决方案2】:

    为什么需要使用 IQueryable?只需使用数组本身:

    .Where(ip => !_filterIp.Contains(ip)).ToList();
    

    您可能想研究一个类似的 stockoverflow 问题: Pass int array in where clause of LINQ Query

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多