views:

54

answers:

1

I am trying to use the Join(...) extension method to build a query based on criteria passed to a method. I have an error in the following:

public static IQueryable QueryItems(string param1, string param2, string param3)
{
    IQueryable<tbl_Item> query = dataMap.tbl_ItemMap;

    //Join is giving me the error: Cannot implicitly convert type
    //System.Linq.IQueryable<AnonymousType#1> to System.Linq.IQueryable<tbl_Item>.
    //An explilct conversion exists
    query = query.Join(dataSet.Tables["tbl_Resource"].AsEnumerable(),
            q => q.OriginalResourceID,
            r => r.Field<int>("ResourceID"),
            (q, r) => new { q, r });

    if (!String.IsNullOrEmpty(param1))
        query = query.Where(...);

    if (!String.IsNullOrEmpty(param2))
        query = query.Where(...);

    if (!String.IsNullOrEmpty(param3))
        query = query.Where(...);

    var results = query.Select(result => new
    {
        Origin = result.OriginalResourceID,   // needs to be a name from Tables["tbl_Resource"]
        Current = result.CurrentResourceID,   // needs to be a name from Tables["tbl_Resource"]
        ...,
        ...,
    });

    return results; // results are displayed in a DataGridView
}

Additional information on the Join extension method shows:

'a is new {tbl_Item q, DataRow r}

I understand that this is most likely the problem. Does this mean it is pointless to hold DataTables in memory for look-ups like this? "tbl_Resource" contains 4 columns, 2 of which are a ResourceID (the key), and a resourceName (what I want to push to the Select extension method).

I won't be naive and believe that I am implementing the best (read most efficient) logic. I can work with creating a Dictionary for the Join method if that is the best solution; however, it would seem that this would give me the same error I have now.

Any ideas?

+1  A: 

You're trying to assign different types of values to your query variable. How about something like this:

public static IQueryable QueryItems(string param1, string param2, string param3)
{

    var query = dataMap.tbl_ItemMap
        .Join(dataSet.Tables["tbl_Resource"].AsEnumerable(),
            q => q.OriginalResourceID,
            r => r.Field<int>("ResourceID"),
            (q, r) => new { q, r });
    ...

Edit

Using the method syntax above can get tedious once you have a number of joins occurring at once. You might want to switch to query syntax to make things simpler. It might end up looking something like this:

var query = from i in dataMap.tbl_ItemMap
            join r in dataSet.Tables["tbl_Resource"].AsEnumerable()
                on i => i.OriginalResourceId equals r.Field<int>("ResourceId")
            join t in dataSet.Tables["tbl_Type"].AsEnumerable()
                on i => i.TypeId equals t.Field<int>("TypeId")
            ...
            select new {
                Origin = r.Title,
                Type = t.Title,
                ...
            };
StriplingWarrior
That is essentially the same thing. I am going to have multiple joins since `tbl_ItemMap` consists of several keyID columns.
dboarman
It will fix the error you mentioned, because the `query` variable you're using is declared as having an anonymous type. I don't know what you mean by having multiple joins. Please try what I'm suggesting and provide a clear explanation of why it's not working for you.
StriplingWarrior
My mistake...I'll give this a shot. I left `query` declared as `IQueryable<tbl_Item>`. What I mean by multiple joins is that the source datamap, `tbl_ItemMap` has many keyID columns: CurResID, OrigResID, TypeID, etc. I will have to join these keyID columns to different tables so that meaningful data is displayed in the DataGridView...make sense?
dboarman
Thanks for the added info. There is a conglomerate of `if-thens` that tack on `Where` extension methods prior to the `Select` method. This has helped me out quite a bit.
dboarman