2013-10-25 72 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之前檢查上面代碼的空值。

相關問題