2017-01-14 3 views
0

Предположим, у нас есть таблица Fruits, и я написал метод GetFruitName. Fruits имеет столбец FruitName из string/varchar тип, который может быть пустым. Итак, если FruitName имеет значение null, я просто хочу вернуть FruitName в качестве фрукта, объединенного с FruitId.Условная проекция с использованием тройного оператора в LINQ Выберите

Я получаю эту ошибку при вызове метода.

LINQ к Entities не распознает метод 'System.String Format (System.String, System.Object)' метод, и этот метод не может быть переведен в выражение магазина.

public class Fruit 
{ 
    public Guid FruitId { get; set; } 
    public string FruitName { get; set; } 
} 

public string GetFruitName(Guid key) 
{ 
    return dbContext.Fruits 
        .Where(fr=> fr.FruitId== key) 
        .Select 
        (
         fr=> 
         fr.FruitName!= null 
          ? fr.FruitName 
          : $"Fruit_{fr.FruitId}" 
        ) 
        .SingleOrDefault(); 
} 

Edit: мне было интересно, если бы мы могли сделать это без использования промежуточной переменной с проверкой нулевой, если заявления.

ответ

2

Вы могли бы попробовать что-то вроде этого:

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;        
} 

Проблемы с запросом не тройной оператор, но string.Format метода, который используется интерполированные строками $"Fruit_{fr.FruitId}". Компилятор переводит интерполированные строки на вызовы string.Format. Для получения дополнительной информации о взаимосвязанных строках, пожалуйста, посмотрите here.

Мне было любопытно, если бы мы могли сделать это, не используя промежуточную переменную с нулевой проверкой, если утверждения.

Update

public string GetFruitName(Guid key) 
{ 
    return dbContext.Fruits 
        .SingleOrDefault(fr=> fr.FruitId== key) 
        ?.FruitName ?? $"Fruit_{key}"; 
} 
+0

Спасибо, Христос. Да, я уже исправил решение этим методом. Но я с нетерпением ожидал любой встроенной коррекции без промежуточной переменной. – Ankit

+0

@Ankit См. Мое обновление. Я думаю, что без переменной temp вы можете написать таким образом. – Christos

+0

Да, работает. Кроме того, он также работал над использованием регулярной конкатенации строк. – Ankit

1

Apparantly, строка интерполяции не работает в запросах 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(); 
    } 
0
public string GetFruitName(Guid key) 
{ 
       var query = dbContext.Fruits 
        .Where(fr => fr.FruitId == key)).ToList() 
       return query.Select 
         (
         fr => 
          fr.FruitName != null 
          ? fr.FruitName 
          : $"Fruit_{fr.FruitId}" 
        ) 
         .SingleOrDefault(); 
} 

попробовать это.