编写一个用作IQueryable的方法

时间:2014-02-26 21:01:06

标签: c# linq lambda

我正在尝试编写此方法:

   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)'方法,   并且此方法无法转换为商店表达式

2 个答案:

答案 0 :(得分:0)

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

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

您可能希望查看类似的stockoverflow问题: Pass int array in where clause of LINQ Query

答案 1 :(得分:0)

从技术上讲,这就足够了

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地址数组。