【问题标题】:C# Razor Linq, one generic variable giving unexpected resultsC# Razor Linq,一个产生意外结果的通用变量
【发布时间】:2019-02-12 17:00:26
【问题描述】:

你能解释一下我在这里做错了什么吗

我在 linq 中使用搜索条件,并且在过滤结果时遇到了这个问题,如果我使用了一个通用变量,那么它不会按预期进行搜索。

我使用了单独的变量并且它起作用了

工作正常:

string city = Request.QueryString["city"];
properties = (Request.QueryString["city"] != null) ? properties.Where(x => x.City == city) : properties;

string pType = Request.QueryString["propertytype"];
properties = (Request.QueryString["propertytype"] != null) ? properties.Where(x => x.PropertyType == pType) : properties;

当我使用一个泛型变量时不起作用:

string searchCriteria = Request.QueryString["city"];
properties = (Request.QueryString["city"] != null) ? properties.Where(x => x.City == searchCriteria) : properties;

searchCriteria= Request.QueryString["propertytype"];
properties = (Request.QueryString["propertytype"] != null) ? properties.Where(x => x.PropertyType == searchCriteria) : properties;

还有使多重搜索更加优化的任何策略。

【问题讨论】:

  • 能否请您详细说明一下——“它没有按预期搜索”
  • 这可能与闭包有关。 where 子句中的 searchCriteria 只能在您将 searchCriteria 重新定义为其他含义之后实际枚举它时进行评估。

标签: c# linq razor model-view-controller


【解决方案1】:

我认为如果你不使用变量会更好,你可以这样做

if(!string.IsNullOrEmpty(Request.QueryString["city"]))
{
   properties =properties.Where(x => x.City == Request.QueryString["city"]);
}


if(!string.IsNullOrEmpty(Request.QueryString["propertytype"]))
{
   properties = properties.Where(x => x.PropertyType == Request.QueryString["propertytype"])
}

【讨论】:

  • LINQ to Entities 无法识别方法 'System.String get_Item(System.String)' 方法,并且该方法无法转换为存储表达式。
【解决方案2】:

这是由Closures 引起的。本质上,Where 子句绑定到变量,执行时该变量的值就是使用的变量。由于 Where 条件仅在您枚举结果时才被评估,这是在您将 searchCriteria 重新定义为其他内容之后发生的。

这里有一个快速的代码 sn-p 来演示:

var list = new List<string>() {"foo", "bar", "bang"};
string parameter = "wibble";
var results = list.Where(x=>x==parameter);
Console.WriteLine(results.FirstOrDefault()??"null");
parameter = "foo";
Console.WriteLine(results.FirstOrDefault()??"null");

输出:


呵呵

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2019-11-24
    • 2013-08-05
    相关资源
    最近更新 更多