以下為部分程式碼
da.SelectCommand = cmd;
da.Fill(dtQry);
con.Close();
var dt = (from t1 in dtQry.AsEnumerable().AsQueryable()
select new
{
XXX1 = (from t4 in db.XXX
where t4.cXXX_CODE == t1[0].ToString()
select t4.cNAME).FirstOrDefault(),
XXX2 = t1[1].ToString(),
XXX3 = t1[2].ToString(),
XXX4 = t1[3].ToString(),
XXX5 = AYDateTime.GetTwdate(t1[4].ToString(), "yyyyMMddHHmmss"),
});
以下為發生錯誤
LINQ to Entities 無法辨識方法 'System.Object get_Item(Int32)' 方法,而且這個方法無法轉譯成存放區運算式。
我該怎麼改寫,請指教,謝謝。
解答: 感謝 chaosfractal 大大的教導。
da.SelectCommand = cmd;
da.Fill(dtQry);
con.Close();
var dt2 = (from t1 in dtQry.AsEnumerable()
select new
{
D1 = t1.Field<string>(0),
D2 = t1.Field<string>(1),
D3 = t1.Field<string>(2),
D4 = t1.Field<string>(3),
D5 = t1.Field<string>(4),
});
var dt = dt2.AsEnumerable().Select(t => new {
XXX_NAME = (from t4 in db.XXX
where t4.cXXX == t.D1
select t4.cNAME).FirstOrDefault(),
cXXX2 = t.D2,
cXXX3 = t.D3,
cXXX4 = t.D4,
DATE = AYDateTime.GetTwdate(t.D5, "yyyyMMddHHmmss"),
});
補充: AYDateTime.GetTwdate自制函式,把民國年字串轉DateTime。
單就閣下的問題所需要知道的
AsQueryable、AsEnumerable最大差異
AsQueryable() 是把你寫的這串Linq轉成SQL到資料庫中執行
AsEnumerable() 把你當前的資料抓到記憶體中在後續DIY
AYDateTime.GetTwdate(...) 是閣下自創的方法嗎?
就算是內建方法,也只有少數方法都能用SQL替代,能轉成SQL的都是能用SQL組合出來且不會太複雜的功能
就像說Linq在DateTime裡面的很多功能與方法就無法轉成SQL~~~
如果一定要用你寫的方法,Linq就不能直接用在資料庫上,而是撈出成物件後再對撈出的資料進行AYDateTime.GetTwdate操作就可以了
阿閣下都抓出資料到dataTable了,為啥還要轉成AsQueryable?
把AsQueryable拿掉看看?
因為下面要用 IQueryable,介接資料,所以需要 AsQueryable
1.若把.AsQueryable()移到最下面呢?
(form .... ).AsQueryable()
2.t1[4]是DateTime吧? 不知這樣會不會出錯t1[4].ToString("yyyyMMddHHmmss")
AYDateTime.GetTwdate <<它是自創涵是沒錯
移到最下面,沒用一樣抱錯
t1[4]是民國年時間字串,需要用AYDateTime.GetTwdate 轉成DateTime型態
好,我馬上來看看
您給的 Linq2EF: ,好像沒效果,但還是謝謝。
目前不管怎麼改,都報這個錯,LINQ to Entities 無法辨識方法 'System.Object get_Item(Int32)' 方法
剛剛用LinqPad試了一下,不確定是否能合到閣下要的~
from p in Log
select new{
p.CreatedOnUtc,
myDate = (p.CreatedOnUtc.Year-1911).ToString() +'-'+p.CreatedOnUtc.Month+'-'+p.CreatedOnUtc.Day
}
主要是DataTable,抓欄位資料失敗,一直報 LINQ to Entities 無法辨識方法 'System.Object get_Item(Int32)' 方法 ,不是時間問題。
我也想 p.XXX,可是會直接紅色波浪。
換個方式取資料看看
var dt=(from t1 in dtQry.AsEnumerable().AsQueryable()
select new
{
XXX2 = t1.Field<int>(1).ToString(),
XXX3 = t1.Field<int>("FieldName").ToString(),
XXX4 = t1.Field<string>(3),
XXX4 = t1.Field<DataTable>(4)
});
var dt2 = dt.ToList();// 強迫先跑過看結果,避開延遲執行
您好,最後一個方法成功了,謝謝。
我補個解答