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,
...
};
精彩评论