Рефакторинг LINQ-запроса - PullRequest
3 голосов
/ 18 августа 2010

Рассмотрим ниже

if(type== "S")
{   
    lstItem.ItemsSource = (from item in Items
              where item.Property1 == "SomeValue"
              select item);
}
else
{
    lstItem.ItemsSource = (from item in Items
              where item.Property2 == "SomeOtherValue"
              select item);
}

. Как можно выяснить, единственная разница между этими двумя запросами заключается только в имени свойства (для первого это Property1 & forвторое это Property2 )

Есть ли лучший способ рефакторинга / записи кода в структурированном виде (некоторый распространенный метод, при котором передается только имя свойства и запись будетотфильтровано согласно этому) или это правильный способ сделать то же самое?

Нужна помощь.

Спасибо

Ответы [ 4 ]

5 голосов
/ 18 августа 2010

Также можно добавить встроенную строку, если в предложении where

lstItem.ItemsSource = 
     (from item in Items
      where (test == "S" ? item.Property1 == "SomeValue" : item.Property2 == "SomeOtherValue")
      select item);
4 голосов
/ 18 августа 2010

Вы можете объединить свои команды в операторах if. E.g.:

var items = from item in Items 
            select item; 

if(type== "S")  
{     
   items = items.Where(item => item.Property1 == "SomeValue");
}  
else  
{  
   items = items.Where(item => item.Property2 == "SomeOtherValue");
}  

Или даже просто напишите более лямбда-структуру в вашем оригинальном коде:

if(type== "S") 
{    
    lstItem.ItemsSource = Items.Where(item => item.Property1 == "SomeValue");
} 
else 
{ 
    lstItem.ItemsSource = Items.Where(item.Property2 == "SomeOtherValue");
}
3 голосов
/ 18 августа 2010

Мне нравится:

lstItem.ItemsSource = Items.Where(type == "S" ? 
                 item => item.Property1 == "SomeValue":
                 item => item.Property2 == "SomeOtherValue");
2 голосов
/ 18 августа 2010

хорошо, вы могли бы начать с того, что свелось выражение к:

Func<Items, bool> expr;

if(type== "S")  
{ 
    expr = (item => item.Property1 == "SomeValue");
}
else
{
    expr = (item => item.Property2 == "SomeOtherValue");
}

var items = Items.Where(expr);

Конечно, план игры в действительности состоит в том, чтобы сделать все это единой системой состояний, но это делает ее НЕМНОГО более управляемой, я думаю :) 1004 *

джим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...