C# 在LINQ Select中使用三元运算符的条件投影
比如说,我们有一个表C# 在LINQ Select中使用三元运算符的条件投影,c#,linq,linq-to-entities,c#-6.0,C#,Linq,Linq To Entities,C# 6.0,比如说,我们有一个表Fruits,我编写了一个方法GetFruitName。 Fruits有一个FruitName列,其类型为string/varchartype,可以为null。 因此,如果fructName为null,我只想将fructName返回为与fructId连接的水果 我在调用该方法时遇到此错误 LINQ to实体无法识别方法“System.String” 格式化(System.String,System.Object)方法,此方法不能 被翻译成商店表达式 编辑: 我很好奇,如果不使
Fruits
,我编写了一个方法GetFruitName。
Fruits有一个FruitName
列,其类型为string/varchar
type,可以为null。
因此,如果fructName为null,我只想将fructName返回为与fructId连接的水果
我在调用该方法时遇到此错误
LINQ to实体无法识别方法“System.String”
格式化(System.String,System.Object)方法,此方法不能
被翻译成商店表达式
编辑:
我很好奇,如果不使用带有null check if语句的中间变量,是否可以执行此操作。您可以尝试以下操作:
public string GetFruitName(Guid key)
{
var fruit = dbContext.Fruits
.SingleOrDefault(fr=> fr.FruitId== key);
// Here is your call. I choosed to return an empty string in case of
// a fruit not found. You can return also null.
var fruitName = string.Empty;
if(fruit != null)
{
// The fruit with the supplied key found. Get it's name.
fruitName = fruit.FruitName != null
? fr.FruitName
: $"Fruit_{fr.FruitId}";
}
return fruitName;
}
查询的问题不是三元运算符,而是插值字符串$“Fruit{fr.FruitId}”
使用的string.Format
方法。编译器将互斥字符串转换为调用string.Format
。有关插值字符串的更多信息,请查看
我很好奇,我们是否可以不用中间产物来做这件事
带有null check if语句的变量
更新
public string GetFruitName(Guid key)
{
return dbContext.Fruits
.SingleOrDefault(fr=> fr.FruitId== key)
?.FruitName ?? $"Fruit_{key}";
}
您可以尝试以下方法:
public string GetFruitName(Guid key)
{
var fruit = dbContext.Fruits
.SingleOrDefault(fr=> fr.FruitId== key);
// Here is your call. I choosed to return an empty string in case of
// a fruit not found. You can return also null.
var fruitName = string.Empty;
if(fruit != null)
{
// The fruit with the supplied key found. Get it's name.
fruitName = fruit.FruitName != null
? fr.FruitName
: $"Fruit_{fr.FruitId}";
}
return fruitName;
}
查询的问题不是三元运算符,而是插值字符串$“Fruit{fr.FruitId}”
使用的string.Format
方法。编译器将互斥字符串转换为调用string.Format
。有关插值字符串的更多信息,请查看
我很好奇,我们是否可以不用中间产物来做这件事
带有null check if语句的变量
更新
public string GetFruitName(Guid key)
{
return dbContext.Fruits
.SingleOrDefault(fr=> fr.FruitId== key)
?.FruitName ?? $"Fruit_{key}";
}
显然,字符串插值在LINQ查询中不起作用。我恢复到常规的字符串上下文,这起作用了
public string GetFruitName(Guid key)
{
return dbContext.Fruits
.Where(fr=> fr.FruitId== key)
.Select
(
fr=>
fr.FruitName!= null
? fr.FruitName
//changed this line
: "Fruit_" + fr.FruitId //or string.Concat("Fruit_", fr.FruitId)
)
.SingleOrDefault();
}
显然,字符串插值在LINQ查询中不起作用。我恢复到常规的字符串上下文,这起作用了
public string GetFruitName(Guid key)
{
return dbContext.Fruits
.Where(fr=> fr.FruitId== key)
.Select
(
fr=>
fr.FruitName!= null
? fr.FruitName
//changed this line
: "Fruit_" + fr.FruitId //or string.Concat("Fruit_", fr.FruitId)
)
.SingleOrDefault();
}
试试这个
试试这个。谢谢,克里斯托斯。是的,我已经用这个方法解决了问题。但我期待任何没有中间变量的内联更正。@Ankit请查看我的更新。我认为如果没有一个临时变量,你可以这样写。是的,很有效。或者,它还可以使用常规字符串concatention。与OP在问题中的尝试不同,您可以从数据库加载完整的
水果
实体,并将其保留在dbContext
中。您可以通过检查生成的SQL,然后检查dbContext.Fruits.Local
来验证这一点。应该提到像这样的行为改变,以便OP能够做出明智的决定是否可以。就我个人而言,我认为OP自己的答案比这个更好。@hvd正确!然而,我不认为一张唱片是一个问题。我把它交给安基特的法官。没问题:)谢谢你,克里斯托斯。是的,我已经用这个方法解决了问题。但我期待任何没有中间变量的内联更正。@Ankit请查看我的更新。我认为如果没有一个临时变量,你可以这样写。是的,很有效。或者,它还可以使用常规字符串concatention。与OP在问题中的尝试不同,您可以从数据库加载完整的水果
实体,并将其保留在dbContext
中。您可以通过检查生成的SQL,然后检查dbContext.Fruits.Local
来验证这一点。应该提到像这样的行为改变,以便OP能够做出明智的决定是否可以。就我个人而言,我认为OP自己的答案比这个更好。@hvd正确!然而,我不认为一张唱片是一个问题。我把它交给安基特的法官。没问题:)