2013-07-25 57 views
0

我创建了一个使用LinqToSql的控制台应用程序。它工作得很好,但我觉得它是一种代码味道。这里是我的linq查询:如何重构C#linq代码?

var personnelInfo = Personnels.Where(p => p.Name.Equals("Steve Jobs")); 

现在,我想报告该对象的各个领域。这是我觉得是代码味道:

Console.WriteLine(String.Format("Emp ID = {0}", personnelInfo.Select(p => p.EmpID).FirstOrDefault())); 
Console.WriteLine(String.Format("Phone# = ({0}) {1}-{2}", 
    personnelInfo.Select(p => p.Phone).FirstOrDefault().Substring(0,3), 
    personnelInfo.Select(p => p.Phone).FirstOrDefault().Substring(3,3), 
    personnelInfo.Select(p => p.Phone).FirstOrDefault().Substring(6,4))); 
Console.WriteLine(String.Format("City = {0}", personnelInfo.Select(p => p.City).FirstOrDefault())); 

这可以重构吗?

回答

1

你应该得到的查询结果只有一次:

var firstPerson = personnelInfo.First(); 
直接

然后,您可以访问属性。

您还应该将电话号码格式转换为单独的可重用功能。

1

我建议一个foreach因为有可能是另一个史蒂夫·乔布斯在那里:

foreach(var personel in personelInfo) 
{ 
    Console.WriteLine(String.Format("Emp ID = {0}", personel.EmpID)); 
    Console.WriteLine(String.Format("Phone# = ({0}) {1}-{2}", 
     personel.Phone.Substring(0,3), 
     personel.Phone.Substring(3,3), 
     personel.Phone.FirstOrDefault().Substring(6,4))); 
    Console.WriteLine(String.Format("City = {0}", personel.City)); 
}