开发者

Problem implementing Join(...) extension method

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 (!开发者_如何学CString.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?


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,
                ...
            };
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜