繁体   English   中英

重构LINQ查询

[英]Refactoring LINQ query

考虑以下

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中重构/编写代码(一些常见的方法,只传递属性名称,并按照那样过滤记录)或者这是做同样的正确方法?

需要帮忙。

谢谢

如果在where子句中也可以添加内联

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

您可以在if语句中链接命令。 例如:

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

我喜欢:

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

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

Func<Items, bool> expr;

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

var items = Items.Where(expr);

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

吉姆

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM