รบกวนปรึกษา การส่งข้อมูล LINQ ระหว่างเมธอดครับ

Go down

รบกวนปรึกษา การส่งข้อมูล LINQ ระหว่างเมธอดครับ

ตั้งหัวข้อ  nattaromn on 25th January 2010, 5:53 am

public partial class _Default : System.Web.UI.Page
{
private ProductTestDataContext db;

public _Default()
{
db = new ProductTestDataContext();
}

protected void Page_Load(object sender, EventArgs e)
{
string LINQString = "db.products.Select(s => new { s.ID, s.nname, s.cat })";
Show(LINQString);
}
private void Show(string LINQString)
{
var ps = LINQString;
int i = 0;
foreach (var p in ps)
{
i++;
MessageBox.Show("IN LINQ : " + p.ID.ToString() + "||" + p.nname.ToString() + "||" + p.cat.ToString());
}

}
}

ผมได้เขียนโปรแกรม อยากจะส่งค่าสตริงของ LINQString ไปยังเมธอด Show เพื่อทำการคิวรีและแสดงผลของข้อมูลในฐานข้อมูล Product
ผมคิดว่าผมคงผิดพลาดที่การส่งค่าสตริงไปคิวรีที่เมธอด Showในส่วนของ string LINQString กับ var ps = LINQString; ผมควรแก้ไขโค้ดอย่างไรดีครับ

ขอขอบพระคุณอาจารย์มากครับที่สละเวลาตอบคำถามของผมและเขียนหนังสือดีๆที่อ่านแล้วเข้าใจง่ายและได้ความรู้ดีๆให้ได้อ่านกันครับ Smile

nattaromn

จำนวนข้อความ : 18
Join date : 10/01/2010

ดูข้อมูลส่วนตัว

ขึ้นไปข้างบน Go down

ถูกต้องดีแล้ว

ตั้งหัวข้อ  Admin on 25th January 2010, 6:22 pm

ดูโค้ดแล้วก็น่าจะถูกต้องดีแล้วนะครับ แต่ถ้าไม่ได้จริงๆ ให้ลองส่งเป็น var แทนที่จะเป็น string ดูสิครับ

Admin
Admin

จำนวนข้อความ : 215
Join date : 17/12/2009

ดูข้อมูลส่วนตัว http://laploy.forumotion.com

ขึ้นไปข้างบน Go down

Re: รบกวนปรึกษา การส่งข้อมูล LINQ ระหว่างเมธอดครับ

ตั้งหัวข้อ  nattaromn on 25th January 2010, 8:50 pm

จากโค้ดที่ผมเขียนไว้ด้านบนเมื่อ run แล้วจะเกิด error 3 ครับอาจารย์
ตรงบรรทัดนี้ครับ
MessageBox.Show("IN LINQ : " + p.ID.ToString() + "||" + p.nname.ToString() + "||" + p.cat.ToString());
คือ
Error 1 'char' does not contain a definition for 'ID' and no extension method 'ID' accepting a first argument of type 'char' could be found (are you missing a using directive or an assembly reference?) D:\LINQtest\Default.aspx.cs 108 46 D:\LINQtest\
Error 2 'char' does not contain a definition for 'nname' and no extension method 'nname' accepting a first argument of type 'char' could be found (are you missing a using directive or an assembly reference?) D:\LINQtest\Default.aspx.cs 108 71 D:\LINQtest\
Error 3 'char' does not contain a definition for 'cat' and no extension method 'cat' accepting a first argument of type 'char' could be found (are you missing a using directive or an assembly reference?) D:\LINQtest\Default.aspx.cs 108 99 D:\LINQtest\

แต่ถ้าเปลี่ยนค่าเป็น var ดังนี้
public partial class _Default : System.Web.UI.Page
{
private ProductTestDataContext db;

public _Default()
{
db = new ProductTestDataContext();
}

protected void Page_Load(object sender, EventArgs e)
{
var LINQString = "db.products.Select(s => new { s.ID, s.nname, s.cat })"; //เปลี่ยนค่าเป็น var ครั้งที่ 1
// var LINQString = db.products.Select(s => new { s.ID, s.nname, s.cat }); //เปลี่ยนค่าเป็น var ครั้งที่ 2
// string LINQString = "db.products.Select(s => new { s.ID, s.nname, s.cat })"; //เปลี่ยนค่ากลับเป็น string เพื่อส่งค่าแบบ generic

Show(LINQString);
// Show<string>(LINQString); //ส่งค่าเป็น generic
}
private void Show(var LINQString) //รับค่าเป็น var
// private void Show<T>(T LINQString) //รับค่าเป็น generic
{
var ps = LINQString;
// T ps = LINQString; //ประกาศตัวแปรเพื่อรับค่าเป็น generic
int i = 0;
foreach (var p in ps)
{
i++;
MessageBox.Show("IN LINQ : " + p.ID.ToString() + "||" + p.nname.ToString() + "||" + p.cat.ToString());
}

}
}
ครับผมได้ลองแล้วครับ โดยการส่งค่าเป็น var ก็จะ error ดังนี้ครับ
Error 1 The contextual keyword 'var' may only appear within a local variable declaration D:\LINQtest\Default.aspx.cs 100 23 D:\LINQtest\

แต่ถ้าผมปรับเปลี่ยนด้วยการส่งค่าแบบ generic ก็จะ error ดังนี้ครับ

Error 1 foreach statement cannot operate on variables of type 'T' because 'T' does not contain a public definition for 'GetEnumerator' D:\LINQtest\Default.aspx.cs 104 9 D:\LINQtest\

ครับผมได้ลองแล้วครับ โดยการส่งค่าเป็น var ก็จะ error ดังนี้ครับ
ทำให้ผมไม่สามารถส่งค่าไปคิวรีที่เมธอด Show ได้ครับ และจะเป็นปัญหาหนักกว่านั้นเมื่อผมนำไปเขียนแบบ OOP ถ้าผมส่งค่าไปคิวรีแบบ LINQ ไม่ได้ ทำให้ผมไม่สามารถแยก ส่วนของ interface กับ ประมวลผลและฐานข้อมูล ออกจากกันได้ครับ
ควรแก้ไขอย่างไรดีครับ ขอรบกวนอาจารย์ด้วยครับ หากผิดพลาดประการใดขออภัยไว้ ณ ที่นี้ด้วยครับ

nattaromn

จำนวนข้อความ : 18
Join date : 10/01/2010

ดูข้อมูลส่วนตัว

ขึ้นไปข้างบน Go down

ลองพิจารณาโค้ดข้างล่าง

ตั้งหัวข้อ  Admin on 25th January 2010, 11:40 pm

ลองดูว่าโค้ดข้างล่างนี้จะช่วยคุณได้ไหม



using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqTest
{
static class test01
{
static void Main()
{
string[] strings = { "one", "two", "three" };
IEnumerable<string> q = strings.Where(s => s.Length < 4);
test(q);
}
static void test(IEnumerable<string> x)
{
foreach (string s in x)
{
Console.WriteLine("Processing " + s);
}
}
}
}

Admin
Admin

จำนวนข้อความ : 215
Join date : 17/12/2009

ดูข้อมูลส่วนตัว http://laploy.forumotion.com

ขึ้นไปข้างบน Go down

เป็นพระคุณอย่างสูงเลยครับอาจารย์ ที่ช่วยเขียนทดลองให้

ตั้งหัวข้อ  nattaromn on 26th January 2010, 1:13 am

เป็นพระคุณอย่างสูงเลยครับอาจารย์ ที่ช่วยเขียนทดลองให้ครับ Very Happy
แต่ยังคงติดปัญหาอยู่อีกนิดนึงครับ หลังจากที่ผมเอาไปเขียน ผมทำในรูปของ Web app ตัว IEnumerable จะอยู่ใน System.Collections.Generic ซึ่งใน Web app จะไม่มีผมจึงทำการ using
เพิ่มลงไป และดัดแปลงของอาจารย์อีกนิดหน่อยในการติดต่อฐานข้อมูลแทน array


public partial class _Default : System.Web.UI.Page
{
private ProductTestDataContext db;

public _Default()
{
db = new ProductTestDataContext();
}
protected void Page_Load(object sender, EventArgs e)
{

//--------------โค้ดของอาจารย์--------------//
/* string[] strings = { "one", "two", "three" };
IEnumerable<string> q = strings.Where(s => s.Length < 10);
test(q);*/


IEnumerable<string> q = from p in db.products select p;
test(q);

}
private void test(IEnumerable<string> x)
{
foreach (string s in x)
{
Response.Write("Processing : " + s.ToString() + "<br> ");
http://Console.WriteLine("Processing " + s);
}
}
}

ถ้าเป็นในส่วนของ array สามารถรันผ่านทำงานได้ไม่เป็นปัญหาครับ แต่พอในส่วนของฐานข้อมูลก็จะเกิด error ดังนี้ครับ
Error 1 Cannot implicitly convert type 'System.Linq.IQueryable<product>' to 'System.Collections.Generic.IEnumerable<string>'. An explicit conversion exists (are you missing a cast?) D:\LINQtest\Default.aspx.cs 31 55 D:\LINQtest\

ต้องขอรบกวนอาจารย์อีกครั้งครับ ขอบพระคุณครับ

nattaromn

จำนวนข้อความ : 18
Join date : 10/01/2010

ดูข้อมูลส่วนตัว

ขึ้นไปข้างบน Go down

แก้ได้แล้วครับ

ตั้งหัวข้อ  nattaromn on 26th January 2010, 2:45 am

แก้ได้แล้วครับ ^^

public partial class _Default : System.Web.UI.Page
{
private ProductTestDataContext db;

public _Default()
{
db = new ProductTestDataContext();
}
protected void Page_Load(object sender, EventArgs e)
{

//--------------โค้ดของอาจารย์--------------//
/* string[] strings = { "one", "two", "three" };
IEnumerable<string> q = strings.Where(s => s.Length < 10);
test(q);*/


IQueryable<string> q = from p in db.products select p;
test(q);

}
private void test(IQueryable<string> x)
{
foreach (string s in x)
{
Response.Write("Processing : " + s.ToString() + "<br> ");
http://Console.WriteLine("Processing " + s);
}
}
}
จริงๆแล้วก็แนวทางอาจารย์นี้แหละครับ ต้องขอขอบพระคุณอาจารย์อีกครั้งน่ะครับที่สละเวลาให้ครับ

ขอขอบคุณครับ Smile

nattaromn

จำนวนข้อความ : 18
Join date : 10/01/2010

ดูข้อมูลส่วนตัว

ขึ้นไปข้างบน Go down

ขึ้นไปข้างบน


 
Permissions in this forum:
คุณไม่สามารถพิมพ์ตอบ