Querying Dataset, nested query

Hi, I wondering if someone could help me out on the syntax of using a nested query to query datatables.

Here is an example provided by LINQ documentation:

DataTable orders      = ds.Tables["SalesOrderHeader"];

DataTable orderLines = ds.Tables["SalesOrderDetail"];

 

var query = from o in ordersQuery

            join ol in orderLinesQuery

            on o.Field<int>("SalesOrderID") equals ol.Field<int>("SalesOrderID")

            where o.Field<bool>("OnlineOrderFlag") == true &&

            o.Field<DateTime>("OrderDate").Month == 8

            select new { SalesOrderID = o.Field<int>("SalesOrderID"),

                       SalesOrderDetailID = ol.Field<int>("SalesOrderDetailID"),

                       OrderDate = o.Field<DateTime>("OrderDate"),

                       ProductID = ol.Field<int>("ProductID") };

 

I want to create a nested query inside the where clause, how do you do this

For example, Select * From Orders, OrderLines  Where ordersID in ( Select OrdersID in OrderLines Where OrderLines ID > 100)

Can you create nested queries using LINQ I need an example in order to figure out the syntax. Is there any further documentation on querying dataset/datatables

 

 




Answer this question

Querying Dataset, nested query

  • enric vives

    I don't know what your datatables look like and I'm not an expert on this, but based on some experimentation I did I think you should try something like this:

    var query = from o in ds.Orders

    where o.OrderID == 45

    from c in ds.Customers

    from co in c.Orders // assuming each Customer has a collection of Orders

    where co.ItemName == o.ItemName // I just made this up

    select c.Name;

    Hope that helps,

    Genevieve Orchard



  • andrealisp

    I like to indent the nested from to make it clearer, e.g.:
                     var orders = from c in customers
                               where c.Region == "WA"
                                   from o in c.Orders
                                   where o.OrderDate >= cutoffDate
                                   select new {c.CustomerID, o.OrderID};

     -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    I'm having trouble implementing this into querying some datatables...

    This is what is intuitive to me coming from sql:

    var query = from c in ds.Customers where c.CustOrder in ( from e in ds.Orders where e.OrderID = 45 ) select new { //SomeSelection}

    I'm not sure if there is a difference when querying datatables versus other objects such as those generated by sqlmetal.

    I know the sql language fairly well so I was hoping that the syntax was for linq was a little more similar.

     

     



  • chadmv

    I was just looking through the LINQ Project Overview document and came across another way of performing a nested query. From page 17:

    SelectMany is ideal for combining two information sources:

    string[] names = { "Burke", "Connor", "Frank", "Everett",

    "Albert", "George", "Harris", "David" };

    var query = names.SelectMany(n =>

    people.Where(p => n.Equals(p.Name))

    );

    In the lambda expression passed to SelectMany, the nested query applies to a different source, but has in scope the n parameter passed in from the outer source. Thus people.Where is called once for each n, with the resulting sequences flattened by SelectMany for the final output. The result is a sequence of all the people whose name appears in the names array.

    Thought I would pass along this information as well.

    -Genevieve Orchard



  • TemporaryNick

    Unfortunately, I have found that the TSQL generated from LINQ with joins typically is converted into sub-selects. In part, this is necessary when considering LINQ's deferred execution scheme. However, it can provide performance issues as the application becomes more chatty over the network and query plan optimizations may not perform as well depending on the indexing schemes in place.

    One other aspect you may want to consider when doing nested queries is the "into" keyword (see page 26 of the C# 3.0 overview document.)

    Jim Wooley
    http://devauthority.com/blogs/jwooley



  • DDressel

    Have you looked at the "multiple from" example at http://msdn.microsoft.com/vcsharp/future/linqsamples/projection/default.aspx#multipleFrom That might help you out.

    I like to indent the nested from to make it clearer, e.g.:

    var orders = from c in customers

    where c.Region == "WA"

    from o in c.Orders

    where o.OrderDate >= cutoffDate

    select new {c.CustomerID, o.OrderID};

    Genevieve Orchard - C# Documentation Team



  • jjb3rd

    Thanks, this is useful.

    If anyone could offer anymore documention on querying datasets that would be much appreciated. I have taken a look at the documentation on the linq webpage but it isn't quite enough.

     

     



  • aruyp

    I have a post regarding the VB implementation of Linq to Datasets at http://devauthority.com/blogs/jwooley/archive/2006/06/10/1276.aspx. It is rather elementary, but might offer some help.

    Jim Wooley
    http://devauthority.com/blogs/jwooley



  • Querying Dataset, nested query