我有一个linq表达式,用于返回CSV文件中的字符串列表。问题是它返回System.Collections.Generic.List'1[System.String]
,其中应该有每个人的数据。
这是表达式
foreach (Person person in persons)
{
var finalValue = person.PersonDatas.Where(x => x.FinalValue != null).ToString();
sb.AppendLine(string.Format("\"{0}\",\"{1}\",\"{2}\"",
person.ClientInternalPerson_ID,
person.FirstName + " " + person.LastName,
finalValue
));
}
我也试过
var finalValue = person.PersonDatas.Where(x => x.FinalValue != null).ToString();
但所有返回的是
System.Linq.Enumerable+WhereListIterator'1[Project.Core.Models.PersonData]
答案 0 :(得分:1)
您无法在查询中调用.ToString
,因为它会返回一个记录集(实际上是IEnumerable<PersonData>
),而不是单个值。然后,您需要像这样迭代它们:
foreach (Person person in persons)
{
var finalValues = person.PersonDatas.Where(x => x.FinalValue != null);
foreach(var finalValue in finalValues)
{
sb.AppendLine(string.Format("\"{0}\",\"{1}\",\"{2}\"",
person.ClientInternalPerson_ID,
person.FirstName + " " + person.LastName,
finalValue));
}
}
您可以使用SelectMany进一步扁平化,但这是一个不同的问题。如果您期望FinalValue!= null的每个人只有1条且只有1条记录,那么您可以使用.First
或.Single
来简化它:
foreach (Person person in persons)
{
var finalValue = person.PersonDatas.First(x => x.FinalValue != null);
sb.AppendLine(string.Format("\"{0}\",\"{1}\",\"{2}\"",
person.ClientInternalPerson_ID,
person.FirstName + " " + person.LastName,
finalValue));
}
答案 1 :(得分:0)
以下命令返回一个可枚举列表,其中包含具有非null FinalValues的PersonData对象:
var finalValue = person.PersonDatas.Where(x => x.FinalValue != null).First().FinalValue.ToString();
您需要从列表中获取特定的PersonData对象。例如,下面将为您提供第一个具有非null FinalValue的PersonData对象的FinalValue。
var finalValuePerson = person.PersonDatas.Where(x => x.FinalValue != null).FirstOrDefault();
var finalValue = (finalValuePerson != null) ? finalValuePerson.FinalValue : "";
注意 - 如果没有匹配,上面的代码会抛出异常。如果您没有这方面的保证,您可以执行以下操作:
app.filter('amCalendarDate', function($translate) {
return function(dt) {
var md = moment(dt), key = '';
if (!dt || !md || (md + '').toLowerCase() == 'invalid date')
return '';
var today = moment();
var diff = today.diff(md, 'days');
if (!diff)
key = 'Today';
else if (diff == -1)
key = 'Tomorrow';
else if (diff == 1)
key = 'Yesterday';
else if (Math.abs(diff) <= 6) {
if (diff < 0)
key = 'Next';
else
key = 'Last';
var days = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
today.day(diff);
key += ' ' + days[today.day()];
}
if (key) {
// if you don't have translate, just return the key
return $translate.amCalendarDate[key];
} else
return md.format('L');
}
});