Linq Contains()方法的意外行为

时间:2013-01-09 13:28:31

标签: c# linq-to-objects contains

在客户过滤器中,此语句会返回selectedIDsCustomerID的{​​{1}}的所有客户。

例如,selectedIDs值'1'返回CustomerID'1'和'10'......

if (!String.IsNullOrEmpty(selectedIDs) && selectedIDs != "*")
{
    query = query.Where(x => selectedIDs.Contains(x.CustomerID.ToString()));
}

如何让此查询仅返回完整selectedIDs的客户?

3 个答案:

答案 0 :(得分:2)

query = query.Where(x => selectedIDs.Split(',')
                              .Contains(x.CustomerID.ToString()));

答案 1 :(得分:1)

你在这里没有使用Linq Contains方法......你正在使用string.Contains方法....你需要使用描绘字符拆分字符串并从那里开始。

var trueSelectedIds = selectedIDs.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
query = query.Where(x => trueSelectedIds.Contains(x.CustomerID.ToString()));

答案 2 :(得分:0)

假设您的CustomerIDint,请在if块中添加以下内容:

var realSelectedIDs = new HashSet(
    selectedIDs.Split(',').Select(s => int.Parse(s)));
query = query.Where(x => realSelectedIDs.Contains(x.CustomerID));

HashSet为您提供O(1)而不是O(n)查询。

(您可能希望使用TryParse代替Parse来防止错误输入,或者您可能不关心。您也可以放弃int.Parse并使用{{ 1}}和以前一样。)