Linq查询在尝试传递从列表对象获取的列值时返回null。是否可以在代码中完成。期待回答或一些建议。
var query = from p in context.ProcessStepTables
where (p.DiagramID == diagramInfo.DiagramID)
orderby p.ProcessNo select new{
DiagramProcessID = p.DiagramProcessID,
ProcessNo = p.ProcessNo,
ProcessID = p.ProcessID,
ProcessName = Process().Find(x =>
p.ProcessID == x.ProcessID).ProcessName.ToString(),
MakerName = Maker().Find(x=>
p.MakerID==x.MakerID).MakerName.ToString(),
Price = p.Price,
Note = p.Note,
Notice = p.Notice
};
private List<MakerTable> Maker()
{
List<MakerTable> pList = new List<MakerTable>();
try
{
IQueryable<MakerTable> maker = (from data in context.MakerTables
select data) as IQueryable<MakerTable>;
foreach (MakerTable val in maker)
{
pList.Add(val);
}
return pList.OrderBy(x => x.MakerName).ToList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
答案 0 :(得分:0)
这是因为,您的提供程序不知道.ToString()
方法,即,当您以IQueryable形式创建查询时,它被转换为等效的SQL查询,因此如果您包含任何C#函数,则事件为非 - 原始数据类型,它会抛出您的错误,因为您的查询构造如下:
"Select s.DiagramProcessID as DiagramProcessID, ...other fields..
from MakerTables s where something.ToString()=='anyvalue'"
很明显,sql对.ToString()
一无所知。
在将.ToList()
应用于您的查询后,只需避免使用自定义选择。
执行该操作或.AsEnumerable()
时,将对数据库执行查询,现在无论是自定义选择还是where子句,都会在CLR上进行翻译
试试这个:
var query = context.ProcessStepTables
.Where(s=>s.DiagramID == diagramInfo.DiagramID)
.OrderBy(s=>s.ProcessNo)
.ToList() //this will cause the query to be executed on the db
//Now perform the selection on returned result set, now the linq
//has to do with this dataset
.Select(s=>new
{
DiagramProcessID = s.DiagramProcessID,
ProcessNo = s.ProcessNo,
ProcessID = s.ProcessID,
//other items in your custom list
});
您也可以使用以下内容替换您的Maker方法:
private List<MakerTable> Maker()
{
try
{
return context.MakerTables.OrderBy(x=>x.MakerName).ToList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
答案 1 :(得分:0)
分解步骤并检查空值,步骤1是查询,然后消费者需要检查标记是否包含有效值:
var query = from p in context.ProcessStepTables
where (p.DiagramID == diagramInfo.DiagramID)
orderby p.ProcessNo
select new{
DiagramProcessID = p.DiagramProcessID,
ProcessNo = p.ProcessNo,
ProcessID = p.ProcessID,
ProcessName = Process().Find(x => p.ProcessID == x.ProcessID).ProcessName.ToString(),
Marker = context.MakerTables
.OrderBy(itm => itm.MakerName)
.FirstOrDefaut(itm => itm.MakerID==x.MakerID))
;
有一种情况是没有找到某些东西,而且发现了异常。在尝试从Marker的属性中提取值之前,最好检查Marker
上的上述代码的空值。