使用 linq 获取单个文本值
Get a single text value using linq
我正在使用这一行来 return 一个值,但它得到的是 True
var valor = valoresCampoAdicionalesEmpresa.Select(p => p.Key == propiedad.Nombre).First();
这是从控制器传递的视图数据
var valoresCampoAdicionalesEmpresa = (字典)ViewData["ValoresCampoAdicionalesEmpresa"];
public ActionResult Edit(int? id)
{
var listFields = from b in db.Propiedades
where b.Entidad.Nombre == "Empresa"
select b;
ViewData["CamposAdicionalesEmpresa"] = listFields.ToList<Propiedad>();
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Empresa empresa = db.Empresas.Find(id);
if (empresa.PropiedadesExtra != null)
{
XElement xmlTree = XElement.Parse(empresa.PropiedadesExtra);
Dictionary<string, string> dict = new Dictionary<string, string>();
foreach (var el in xmlTree.Elements())
{
dict.Add(el.Name.LocalName, el.Value);
}
ViewData["ValoresCampoAdicionalesEmpresa"] = dict;
}
if (empresa == null)
{
return HttpNotFound();
}
return View(empresa);
}
需要是 .Where(),而不是 .Select()。 .Select() returns 表达式的结果,它是一个布尔值。 .Where() returns 表达式为真时的结果。
将您的 Select
更改为 Where
。 Where
使用谓词来过滤数据和 return 相同的结构...只是一个子集。另一方面,Select
将数据结构更改为在提供的函数中评估的任何内容。在您的情况下,您正在将结构更改为单个 Boolean
结果,等同于 Key
是否等于 Nombre
。固定代码如下:
var valor = valoresCampoAdicionalesEmpresa.Where(p => p.Key == propiedad.Nombre).First();
而且,正如评论中指出的那样,First
* 接受谓词本身,因此您可以简单地将 First
称为 Where
和 First
var valor = valoresCampoAdicionalesEmpresa.First(p => p.Key == propiedad.Nombre);
如果什么都没有,First
将抛出,因此如果更合适,您可以使用 FirstOrDefault
这样的话,FirstOrDefault
就是你想要的:
var valor = valoresCampoAdicionalesEmpresa.FirstOrDefault(p => p.Key == propiedad.Nombre);
使用 .FirstOrDefault()
并且在声明中更明确一点不会有什么坏处。
string? valor = valoresCampoAdicionalesEmpresa.FirstOrDefault(p => p.Key == propiedad.Nombre);
我正在使用这一行来 return 一个值,但它得到的是 True
var valor = valoresCampoAdicionalesEmpresa.Select(p => p.Key == propiedad.Nombre).First();
这是从控制器传递的视图数据
var valoresCampoAdicionalesEmpresa = (字典)ViewData["ValoresCampoAdicionalesEmpresa"];
public ActionResult Edit(int? id)
{
var listFields = from b in db.Propiedades
where b.Entidad.Nombre == "Empresa"
select b;
ViewData["CamposAdicionalesEmpresa"] = listFields.ToList<Propiedad>();
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Empresa empresa = db.Empresas.Find(id);
if (empresa.PropiedadesExtra != null)
{
XElement xmlTree = XElement.Parse(empresa.PropiedadesExtra);
Dictionary<string, string> dict = new Dictionary<string, string>();
foreach (var el in xmlTree.Elements())
{
dict.Add(el.Name.LocalName, el.Value);
}
ViewData["ValoresCampoAdicionalesEmpresa"] = dict;
}
if (empresa == null)
{
return HttpNotFound();
}
return View(empresa);
}
需要是 .Where(),而不是 .Select()。 .Select() returns 表达式的结果,它是一个布尔值。 .Where() returns 表达式为真时的结果。
将您的 Select
更改为 Where
。 Where
使用谓词来过滤数据和 return 相同的结构...只是一个子集。另一方面,Select
将数据结构更改为在提供的函数中评估的任何内容。在您的情况下,您正在将结构更改为单个 Boolean
结果,等同于 Key
是否等于 Nombre
。固定代码如下:
var valor = valoresCampoAdicionalesEmpresa.Where(p => p.Key == propiedad.Nombre).First();
而且,正如评论中指出的那样,First
* 接受谓词本身,因此您可以简单地将 First
称为 Where
和 First
var valor = valoresCampoAdicionalesEmpresa.First(p => p.Key == propiedad.Nombre);
如果什么都没有,First
将抛出,因此如果更合适,您可以使用 FirstOrDefault
这样的话,FirstOrDefault
就是你想要的:
var valor = valoresCampoAdicionalesEmpresa.FirstOrDefault(p => p.Key == propiedad.Nombre);
使用 .FirstOrDefault()
并且在声明中更明确一点不会有什么坏处。
string? valor = valoresCampoAdicionalesEmpresa.FirstOrDefault(p => p.Key == propiedad.Nombre);