C# 尝试从列表对象传递列值时返回null的Linq查询

C# 尝试从列表对象传递列值时返回null的Linq查询,c#,wpf,linq,c#-4.0,C#,Wpf,Linq,C# 4.0,尝试传递从列表对象获取的列值时返回null的Linq查询。是否可以按照代码中的操作进行。期待回答或一些建议 var query = from p in context.ProcessStepTables where (p.DiagramID == diagramInfo.DiagramID) orderby p.ProcessNo select new{ DiagramProcessID = p.DiagramP

尝试传递从列表对象获取的列值时返回null的Linq查询。是否可以按照代码中的操作进行。期待回答或一些建议

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

这是因为,您的提供程序不知道.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是启动查询,然后使用者需要检查标记是否包含有效值:

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

在这种情况下,找不到某个对象,而该对象正在抛出异常。在尝试从标记的属性中提取值之前,最好先检查标记上的上述代码是否为null off。

在代码的何处返回null?消息是什么?我可以看到,由于某些异常,返回值可能为null。最好删除或注释掉所有的try-catch块以对其进行调试。很抱歉,查询异常LINQ-to-Entities无法识别方法“System.String-ToString”方法,并且此方法无法转换为存储表达式。var查询部分返回异常!Maker方法的整个定义可以只替换为一行,即返回context.MakerTables.OrderByx=>x.MakerName.ToList;你有没有试过不打2.ToString电话?