我正在尝试使用Join(...)扩展方法根据传递给方法的条件构建查询。我有以下错误:
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
}
有关Join扩展方法的其他信息显示:
'a is new {tbl_Item q, DataRow r}
我知道这很可能是问题所在。这是否意味着将DataTables保存在内存中以供查找这样的查找? “tbl_Resource”包含4列,其中2列是ResourceID(键)和resourceName(我想推送到Select扩展方法)。
我不会天真并且相信我正在实施最好的(读取最有效的)逻辑。如果这是最好的解决方案,我可以为Join方法创建一个Dictionary;但是,这似乎会给我带来与现在相同的错误。
有什么想法吗?
答案 0 :(得分:1)
您正在尝试为query
变量分配不同类型的值。这样的事情怎么样:
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 });
...
修改强>
一旦有多个连接发生,使用上面的方法语法会变得乏味。您可能希望切换到查询语法以使事情变得更简单。最终可能看起来像这样:
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,
...
};