2014-04-11 14 views
0

我有以下:在具有Oracle查詢變種訪問字段導致

var conn = new DataStore(_db.ConnectionStrings.First(p => p.Name == "OracleConn").Value); 
var results = conn .ExecuteQuery(_oracleQuery).Tables[0].AsEnumerable(); 

if (results.Count() > 0) 
{ 
    var record = results.First(); 

    var result = new 
    { 
    success = true, 
    personId= QueryParse.ToString(record["personId"]) 
    }; 
    } 

存儲過程(_oracleQuery)爲:

SELECT personID from People 

我有以下:

foreach (var person in _db.People.OrderByDescending(p => p.LastUpdated)) 
    { 
     data.Add(new List<string> 
     { 
      person.UserId, 
      person.FullName, 
      person.Title 
     }  
    } 

,但需要在那裏添加oracle查詢,如果id存在,那麼'Y',否則顯示'N'。 我不能,雖然補充一點:

(results.Where(p => p.personID== person.personId).FirstOrDefault() == null? "N" : "Y") 

,因爲我得到了以下錯誤消息:

「的System.Data.DataRow」不包含一個定義爲「PERSONID」,沒有擴展方法「PERSONID '接受'System.Data.DataRow'類型的第一個參數可能被發現(你是否遺漏了使用指令或程序集引用?)

我該如何實現?

回答

1

它看起來像結果是某種形式的DataRows Enumerable。 正如我們所見here DataRow沒有任何名爲personId的方法或屬性。這就是當你寫p.personID的時候給你的錯誤

這意味着你必須使用你的列名來獲得你的價值,就像你之前做過的那樣,並且確保你爲了比較而正確投射。現在

(results.Where(p => (int)p["personId"] == person.personId).FirstOrDefault() == null? "N" : "Y") 

,它將從P數據行,當你寫P [「PERSONID」]和流延是一個int,這樣你就可以正確地把它比作無論是在PERSON.PERSONID搶PERSONID。我還建議重寫你的linq查詢,這樣你就可以使用.Any()使它更具可讀性。

results.Any(p => (int)p["personId"] == person.personId) ? "Y" : "N"; 

我希望這是有道理的。