iT邦幫忙

0

dataTable 轉 IQueryable 發生錯誤,怎麼解決? (已解決)

以下為部分程式碼

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。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
舜~
iT邦高手 1 級 ‧ 2019-04-25 15:33:04
最佳解答

單就閣下的問題所需要知道的
AsQueryable、AsEnumerable最大差異
AsQueryable() 是把你寫的這串Linq轉成SQL到資料庫中執行
AsEnumerable() 把你當前的資料抓到記憶體中在後續DIY

AYDateTime.GetTwdate(...) 是閣下自創的方法嗎?
就算是內建方法,也只有少數方法都能用SQL替代,能轉成SQL的都是能用SQL組合出來且不會太複雜的功能

就像說Linq在DateTime裡面的很多功能與方法就無法轉成SQL~~~

如果一定要用你寫的方法,Linq就不能直接用在資料庫上,而是撈出成物件後再對撈出的資料進行AYDateTime.GetTwdate操作就可以了


阿閣下都抓出資料到dataTable了,為啥還要轉成AsQueryable?
把AsQueryable拿掉看看?

看更多先前的回應...收起先前的回應...
優悠 iT邦新手 3 級 ‧ 2019-04-25 16:14:24 檢舉

因為下面要用 IQueryable,介接資料,所以需要 AsQueryable

舜~ iT邦高手 1 級 ‧ 2019-04-25 16:20:21 檢舉

1.若把.AsQueryable()移到最下面呢?
(form .... ).AsQueryable()
2.t1[4]是DateTime吧? 不知這樣會不會出錯t1[4].ToString("yyyyMMddHHmmss")

優悠 iT邦新手 3 級 ‧ 2019-04-25 16:21:30 檢舉

AYDateTime.GetTwdate <<它是自創涵是沒錯

優悠 iT邦新手 3 級 ‧ 2019-04-25 16:23:12 檢舉

移到最下面,沒用一樣抱錯

舜~ iT邦高手 1 級 ‧ 2019-04-25 16:26:37 檢舉
優悠 iT邦新手 3 級 ‧ 2019-04-25 16:27:09 檢舉

t1[4]是民國年時間字串,需要用AYDateTime.GetTwdate 轉成DateTime型態

優悠 iT邦新手 3 級 ‧ 2019-04-25 16:27:31 檢舉

好,我馬上來看看

優悠 iT邦新手 3 級 ‧ 2019-04-25 16:34:16 檢舉

您給的 Linq2EF: ,好像沒效果,但還是謝謝。
目前不管怎麼改,都報這個錯,LINQ to Entities 無法辨識方法 'System.Object get_Item(Int32)' 方法

舜~ iT邦高手 1 級 ‧ 2019-04-25 17:00:35 檢舉

剛剛用LinqPad試了一下,不確定是否能合到閣下要的~

from p in Log
select new{
	p.CreatedOnUtc,
	myDate = (p.CreatedOnUtc.Year-1911).ToString() +'-'+p.CreatedOnUtc.Month+'-'+p.CreatedOnUtc.Day
}
優悠 iT邦新手 3 級 ‧ 2019-04-25 17:03:51 檢舉

主要是DataTable,抓欄位資料失敗,一直報 LINQ to Entities 無法辨識方法 'System.Object get_Item(Int32)' 方法 ,不是時間問題。

優悠 iT邦新手 3 級 ‧ 2019-04-25 17:06:28 檢舉

我也想 p.XXX,可是會直接紅色波浪。

舜~ iT邦高手 1 級 ‧ 2019-04-25 23:13:04 檢舉

換個方式取資料看看

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();// 強迫先跑過看結果,避開延遲執行
優悠 iT邦新手 3 級 ‧ 2019-04-26 09:22:09 檢舉

您好,最後一個方法成功了,謝謝。
我補個解答

我要發表回答

立即登入回答