2013-10-25 32 views
0

Linq查询在尝试传递从列表对象提取的列值时返回null。是否有可能按照代码完成。期待回答或一些建议。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; 
    } 
} 
+1

在代码中它是否返回null? – OmegaMan

+0

什么信息?由于某些例外,我可以看到返回值可能为空。最好删除或注释掉所有'try-catch'块来调试它。 –

+0

对不起,查询是异常“LINQ to Entities不能识别方法'System.String ToString()'方法,并且此方法不能被转换为存储表达式。” var查询部分正在返回异常! – neo

回答

0

那是因为,你的供应商并不知道.ToString()方法,即,当您创建IQueryable的形式查询,它被翻译成等价的SQL查询,因此,如果您有任何C#功能,事件非-primitive数据类型,它会抛出这样的错误,因为你的查询被构造类似如下:

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

分解成步骤并检查是否为空,步骤1是查询进行,然后消费者需要t因为如果标记包含有效的值o检查:

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之前检查上面代码的空值。

相关问题