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正确!然而,我不认为一张唱片是一个问题。我把它交给安基特的法官。没问题:)