Home » Questions » Computers [ Ask a new question ]

c# - Filling a DataSet or a DataTable from a LINQ query result set -

"How do you expose a LINQ query as an ASMX web service?

Usually, from the business tier, I can return a typed DataSet or a DataTable which can be serialized for transport over ASMX.
How can I do the same for a LINQ query?
Is there a way to populate a typed DataSet or a DataTable via a LINQ query?
public static MyDataTable CallMySproc()
{
string conn = ""..."";

MyDatabaseDataContext db = new MyDatabaseDataContext(conn);
MyDataTable dt = new MyDataTable();

// execute a sproc via LINQ
var query = from dr
in db.MySproc().AsEnumerable
select dr;

// copy LINQ query resultset into a DataTable -this does not work !
dt = query.CopyToDataTable();

return dt;
}

How could I put the result set of a LINQ query into a DataSet or a DataTable?

Alternatively, can the LINQ query be serializable so that I can expose it as an ASMX web service?





c# linq web-services .net-3.5












ShareShare a link to this question Copy linkCC BY-SA 4.0



Improve this question




Follow
Follow this question to receive notifications











edited Jan 7 at 14:09





CommunityBot

111 silver badge







asked Aug 1 '08 at 4:59





Geoff DalgasGeoff Dalgas

5,90866 gold badges4040 silver badges5858 bronze badges"

Asked by: Guest | Views: 309
Total answers/comments: 4
bert [Entry]

"As mentioned in the question, IEnumerable has a CopyToDataTable method:

IEnumerable<DataRow> query =
from order in orders.AsEnumerable()
where order.Field<DateTime>(""OrderDate"") > new DateTime(2001, 8, 1)
select order;

// Create a table from the query.
DataTable boundTable = query.CopyToDataTable<DataRow>();

Why won't that work for you?"
bert [Entry]

"To perform this query against a DataContext class, you'll need to do the following:

MyDataContext db = new MyDataContext();
IEnumerable<DataRow> query =
(from order in db.Orders.AsEnumerable()
select new
{
order.Property,
order.Property2
})
as IEnumerable<DataRow>;
return query.CopyToDataTable<DataRow>();

Without the as IEnumerable<DataRow>; you will see the following compilation error:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)"
bert [Entry]

"Make a set of Data Transfer Objects, a couple of mappers, and return that via the .asmx.
You should never expose the database objects directly, as a change in the procedure schema will propagate to the web service consumer without you noticing it."
bert [Entry]

If you use a return type of IEnumerable, you can return your query variable directly.