-2

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

//item.statusId 可以为空 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.Nullable1[System.Int32])' 方法,并且此方法无法转换为商店表达式。`

知道如何重写它吗?

4

2 回答 2

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();
于 2013-01-21T09:07:53.130 回答
0

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

像这样:

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

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


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

于 2013-01-21T09:08:01.417 回答