我尝试根据未知数量的过滤器过滤我的项目。
// 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])'方法,此方法无法转换为商店表达式。
知道怎么重写吗?
答案 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语句,但如果您像上面那样编写它,您应该获得相同的结果并且它将起作用。