2013-06-20 3 views
0

Мы используем следующий фрагмент кода для выбора конкретного object от collection на основе имени property.Запрос Linq для выбора записи

 ObservableCollection<Test> collection = new ObservableCollection<Test>(); 
     collection.Add(new Test() { Id =1, Name ="Nestor"}); 
     collection.Add(new Test() { Id = 2, Name = "Rohan" }); 
     collection.Add(new Test() { Id = 3, Name = "Guy" }); 
     collection.Add(new Test() { Id = 4, Name = "Mike" }); 

     string s = "Rohan"; 
     var temp = collection.FirstOrDefault(x => 
      { 
       if (x.Name != null) 
       { 
        return x.Name.ToString().Equals(s); 
       } 
       else 
       { 
        return x.Name; 
       } 
      }); 

Мы получили следующую ошибку в этом фрагменте кода.

Ошибка:

Error 1 Cannot convert lambda expression to delegate type 'System.Func' because some of the return types in the block are not implicitly convertible to the delegate return type C:\Users\vadiveln\documents\visual studio 2010\Projects\WindowsFormsApplication12\WindowsFormsApplication12\Program.cs 36 25 WindowsFormsApplication12 Error 2 Cannot implicitly convert type 'string' to 'bool' C:\Users\vadiveln\documents\visual studio 2010\Projects\WindowsFormsApplication12\WindowsFormsApplication12\Program.cs 36 32 WindowsFormsApplication12

Можете ли вы смотреть на это и представить предложение использовать правильный способ Linq query. Заранее спасибо.

Модифицированный код ниже:

 ObservableCollection<Test> collection = new ObservableCollection<Test>(); 
     collection.Add(new Test() { Id = 1 }); 
     collection.Add(new Test() { Id = 2, Name = "Rohan" }); 
     collection.Add(new Test() { Id = 3, Name = "Guy" }); 
     collection.Add(new Test() { Id = 4, Name = "Mike" }); 

     string s = "Rohan"; 
     var temp = collection.FirstOrDefault(x => 
     { 
      return x.Name.Equals(s);    

     }); 

Мы используем в нуль, поданный в основной коллекции. Тогда как использовать Linq запрос

+1

Ваша лямбда возвращает 'string' или' bool' в зависимости от отрасли это принимает. –

+0

Разве x.Name уже строка? Почему ToString()? –

+1

erm ... всем вам ... не собиралась. FirstOrDefault (x => x == s); сравнить объекты Test со строкой s? Так что наверняка это должна быть коллекция. FirstOrDefault (x => x.Name == s) –

ответ

1

Это должно быть так же просто, как var temp = collection.FirstOrDefault(x => x.Name == s);

0

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

string s = "Rohan"; 
var temp = collection.FirstOrDefault(x => (x.Name != null) && 
              (x.Name.Equals(s))); 

или более просто:

var temp = collection.FirstOrDefault(x => x.Name == s); 

FirstOrDefault может возвращать нулевое значение, если никакие пункты не найдены по вашим критериям, так что это хорошая идея, чтобы проверить наличие нулевых значений перед использованием temp:

if (temp == null) 
{ 
    // not found... 
} 
0

Похоже, что вы пытаетесь получить первый элемент, имеющий имя, равное Rohan:

// Name is string, you don't need to call ToString() for comparison 
var temp = collection.FirstOrDefault(x => x.Name == s); 

Что случилось с вашим текущим запросом? FirstOrDefault метод требует параметра предиката, который возвращает логический результат. Но в настоящее время вы пытаетесь вернуть строку x.Name из предиката.

var temp = collection.FirstOrDefault(x => 
    { 
     if (x.Name != null) 
     { 
      // this is OK, you are returning boolean     
      return x.Name.ToString().Equals(s); 
     } 
     else 
     { 
      // instead of return x.Name which is string 
      return false; 
     } 
    }); 

Измененного код генерирует ошибку, потому что некоторые объекты из коллекции могут иметь Name свойства, равное null. Когда вы пытаетесь позвонить null.Equals(s), вы получаете NullReferenceException. Чтобы исправить это просто сравнить две строки:

var temp = collection.FirstOrDefault(x => 
       { 
        //return x.Name.Equals(s); 
        return x.Name == s; // will not throw if name is null 
       }); 
0

Я понятия не имею, что вы пытаетесь достичь, но вы полностью делаете это неправильно :)

var temp = collection.FirstOrDefault(x => 
    { 
     if (x.Name != null) 
     { 
      // this part returns bool 
      return x.Name.ToString().Equals(s); 
     } 
     else 
     { 
      // this one returns string 
      return x.Name; 
     } 
    }); 

Я думаю, что вы ищете для действительно простых FirstOrDefault(x => x == s); здесь.

0

FirstOrDefault принимает делегата, который возвращает TRUE или FALSE для каждого элемента в коллекции.

Внутри вашего ELSE вам нужно сравнить x.Name с s:

return x.Name.Equals(s); 

, а не только

return x.Name; 
1

типы возврата различны.

if (x.Name != null) 
{ 
    return x.Name.ToString().Equals(s); // returns bool 
} 
else 
{ 
    return x.Name; // returns string (or null) 
} 

То, что вы, вероятно, нужно:

collection.FirstOrDefault(x => x == s);