重构LINQ查询

时间:2010-08-18 10:00:26

标签: c# .net linq c#-3.0

考虑以下

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 &第二个是 Property2

有没有更好的方法在结构化的mannner中重构/编写代码(一些常见的方法,只传递属性名称,并按照那样过滤记录)或者这是做同样的正确方法?

需要帮助。

由于

4 个答案:

答案 0 :(得分:5)

也可以在where子句

中添加内联
lstItem.ItemsSource = 
     (from item in Items
      where (test == "S" ? item.Property1 == "SomeValue" : item.Property2 == "SomeOtherValue")
      select item);

答案 1 :(得分:4)

您可以在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");
}  

或者甚至只是在你的orignal代码中写出更整洁的lambda结构:

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

答案 2 :(得分:3)

我喜欢:

lstItem.ItemsSource = Items.Where(type == "S" ? 
                 item => item.Property1 == "SomeValue":
                 item => item.Property2 == "SomeOtherValue");

答案 3 :(得分:2)

好吧,你可以先将表达式归结为:

Func<Items, bool> expr;

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

var items = Items.Where(expr);

当然,游戏计划真的是让它成为一个单一的状态网络,但这让我觉得它更易于管理:)

吉姆