2015-03-18 5 views
0

У меня есть ряд подобных методов, которые содержат запросы linq - вот пример. Единственное различие - это предложение .Where, поданное параметром.C# Метод использования выражения linq

public Supplier FindAny(int ID) 
    { 
     return CompareView.Select() 
      .Where(p => p.Supplier.ID == ID) 
      .Select(p => p.Supplier) 
      .FirstOrDefault(); 
    } 

Я ищу, чтобы проверить, можно ли уменьшить код с помощью выражений. На сегодняшний день я нашел несколько примеров используемых выражений, но ничего, что помогло мне успешно конвертировать код.

Во-первых, было бы хорошо знать, могут ли выражения использоваться с этим стилем кода, и если это возможно, любые указатели будут оценены.

ответ

3

прямо вперед перевод будет:

public Supplier FindAny(Func<WhateverTypePIs, bool> func) 
{ 
    return CompareView.Select() 
     .Where(func) 
     .Select(p => p.Supplier) 
     .FirstOrDefault(); 
} 

..which позволит это:

var supplier = FindAny(p => p.Supplier.ID == ID); 

Примечание: Вы должны заполнить WhateverTypePIs универсального типа .. как то ISN 't показано в вашем исходном вопросе (это то, что p типа находится в вашем текущем выражении).

+0

Выражение не должно быть даже необходимо. 'Func ' должно быть достаточно. – Mathew

+0

Отличная точка @ Матью. Я обновлю свой ответ. –

+0

Я довольно долго общался с этим - мой код не слишком отличался от вашего, но продолжал получать синтаксические ошибки. Ваше последнее предложение дало мне ответ: я просил поставщика, а не Продукт, что и есть «p». – dotnetnoob

1

ли эта помощь:

public Supplier FindAny(Func<WhateverTypePIs, bool> func) 
{ 
    return CompareView.FirstOrDefault(func).Supplier 
} 
+0

Это вызовет 'NullReferenceException', если предикат ничего не соответствует. –

+1

Упс! Точка: вам может не понадобиться несколько Linq. Возможно, 'CompareView.FirstOrDefault (p => p.Supplier.ID == ID)' достаточно – Graham