我今天遇到了这种情况,在网上找不到我想要的东西。
看看这段代码,
myCollection.Select(g => new ReportLine
{
cds = (sectors.FirstOrDefault(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE)) != null ?
sectors.FirstOrDefault(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE)).USER != null?
sectors.FirstOrDefault(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE)).USER.USER_FIRSTNAME : "": "")
+ " " +
(sectors.FirstOrDefault(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE)) != null ?
sectors.Where(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE)).FirstOrDefault().USER != null?
sectors.Where(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE)).FirstOrDefault().USER.LASTNAME : "" : "")
});
基本上" myCollection"是一个深层类的列表,这个请求进入它提取名字和姓氏,并在检查是否没有空值时将它们放在另一个类中。
你注意到我实现了6次检查同样的事情:
sectors.FirstOrDefault(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE))
(可能对表现感到痛苦)
存在"存储" linq表达式中的值?像这样的东西:
myCollection.Select(g => new ReportLine
{
cds = ((var tmp =sectors.FirstOrDefault(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE))) != null ?
tmp.USER != null?
tmp.USER.USER_FIRSTNAME + "" + tmp.USER.LASTNAME: "": "")
});
答案 0 :(得分:2)
我认为你可能不得不改为使用LINQ来实现它,但你可以使用LINQ's let clause在表达式的中间分配变量。
答案 1 :(得分:2)
试试这个:
myCollection.Select(g => {
var sect_code = g.Contract.Station.Sector.SECT_CODE;
var sector = sectors.FirstOrDefault(s => s.SECT_CODE.Equals(sect_code));
var firstName = sector != null ?
(sector.USER != null ? sector.USER.USER_FIRSTNAME: "") :
"";
var lastName = sector != null ?
(sector.USER != null ? sector.USER.LASTNAME : "") :
"";
return new ReportLine
{
cds = string.Format("{0} {1}", firstName, lastName)
};
});
答案 2 :(得分:0)
myCollection.Select(g => { var temp = sectors.FirstOrDefault(); ...
返回新的ReportLine(){..};
})
答案 3 :(得分:0)
这应该是你要找的东西:
myCollection.Select(g => new ReportLine
{
cds = (from s in sectors
where s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE) && s.USER != null
select string.Format("{0} {1}", s.USER.USER_FIRSTNAME, s.USER.USER_LASTNAME)).FirstOrDefault() ?? " "
});
答案 4 :(得分:-1)
您可以将Select
语句中的逻辑提取到单独的方法中,并在Select
语句中调用它吗?
像...一样的东西。
private string Foo(Sector input)
{
var tmp = g.SECT_CODE.Equals etc etc
return tmp.USER != null ? etc etc
}
...
myCollection.Select(g => Foo(g))