如何使用linq和`contains`进行过滤

时间:2013-01-21 09:05:56

标签: c# linq entity-framework

我尝试根据未知数量的过滤器过滤我的项目。

// item.statusId是可以为null的int // statusIds是一个字符串

{...


        var statusIds = Convert.ToString(items["StatusId"]);//.Split(';');

        results = mMaMDBEntities.MamConfigurations.Where(item => 
                  FilterByStatusId(statusIds, item.StatusId)).ToList();

    } 
    return results;
}


private bool FilterByStatusId(string statusIds, int? statusId)
{
    return statusIds.Contains(statusId.ToString());
}

但是我收到了这个错误: LINQ to Entities does not recognize the method 'Boolean FilterByStatusId(System.String, System.Nullable 1 [System.Int32])'方法,此方法无法转换为商店表达式。

知道怎么重写吗?

2 个答案:

答案 0 :(得分:2)

如果statusIds是一个数组,那么你可以这样做:

results = mMaMDBEntities.MamConfigurations
                        .Where(item => statusIds.Contain(item.StatusID)).ToList();

一些类似于SQL Select * from table where ID in (1,2,3)

的内容

编辑:

从您的代码中可以看出,您有一个以分号分隔值的字符串。您可以尝试以下方法来获取int的数组,然后在LINQ表达式中使用它。

var str = Convert.ToString(items["StatusId"]);//.Split(';');
// string str = "1;2;3;4;5"; //similar to this. 
int temp;
int[] statusIds = str.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries)
                     .Select(r => int.TryParse(r, out temp) ? temp : 0)
                     .ToArray();

然后您可以在表达式中使用int数组,如:

results = mMaMDBEntities.MamConfigurations
                        .Where(item => statusIds.Contain(item.StatusID)).ToList();

答案 1 :(得分:0)

为什么不直接将谓词语句插入到where子句中?

像这样:

results = mMaMDBEntities.MamConfigurations.Where(item => statusIds.Contains(item.StatusId).ToList();

您可能需要将Split生成的字符串数组转换为List或IEnumerable以使其工作。


异常是不言自明的,该方法无法以您编写的形式转换为SQL语句,但如果您像上面那样编写它,您应该获得相同的结果并且它将起作用。