从字符串数组中搜索并忽略该完全匹配的字符串

时间:2016-10-15 10:56:12

标签: c# linq

如何使用linq查询

忽略字符串数组的完全匹配

这是我的代码有什么不对吗

public string GetItems(string SearchText, Int64 userID, Int64 orgID, Int64 locationID, string[] selectedProductName)
{
    List<Product> searchList = new List<Product>();
    string jsonText = "";
    try
    {            
            searchList = dbContext.usp_ang_GetProductList_(orgID, SearchText, locationID, 0).ToList();
            var abc = searchList.Where(a => a.Name.Any(a.Name != selectedProductName).ToList();
            jsonText = JsonConvert.SerializeObject(abc);            
    }
    catch (Exception ex)
    {

    }
    return jsonText;
}

2 个答案:

答案 0 :(得分:2)

您对.Any的使用不正确:

  1. 在您目前的使用中,您正在检查any的{​​{1}}是否char construct a.name匹配一些谓词。
  2. .Any(a.Name != selectedProductName) - 您需要形成格式正确的lambda表达式
  3. 您想要检查any数组的selectedProductName值是否等于a.Name

    var abc = searchList.Where(a => !selectedProductName.Any(name => name == a.Name)).ToList();
    

    由于selectedProductNamestring[],因此使用.Contains更简洁:

    var abc = searchList.Where(a => !selectedProductName.Contains(a.Name)).ToList();
    

    同样令人遗憾的是,从数据库中提取所有数据只是为了过滤它之后的行。如果删除ToList(),则会在数据库中进行过滤:

    var abc = dbContext.usp_ang_GetProductList_(orgID, SearchText, locationID, 0)
                       .Where(a => !selectedProductName.Contains(a.Name)).ToList();
    

答案 1 :(得分:1)

您需要检查selectedProductName列表中是否没有名称,为此您可以使用Contains子句

var abc = searchList.Where(a => !selectedProductName.Contains(a => a.Name )).ToList();

为了更好的表现,你可以在一个陈述中做所有的事情

var abc = dbContext.usp_ang_GetProductList_(orgID, SearchText, locationID, 0)
                  .Where(a => !selectedProductName.Contains(a.Name)).ToList();