代码之家  ›  专栏  ›  技术社区  ›  IAbstract

实现Join(…)扩展方法时出现问题

  •  1
  • IAbstract  · 技术社区  · 15 年前

    我正试图使用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
    }
    

    有关联接扩展方法的其他信息显示:

    'a is new {tbl_Item q, DataRow r}
    

    我不会天真,相信我正在实现最好的(阅读最有效的)逻辑。如果这是最好的解决方案,我可以为Join方法创建字典;但是,这似乎会给我带来与现在相同的错误。

    有什么想法吗?

    1 回复  |  直到 15 年前
        1
  •  1
  •   StriplingWarrior    15 年前

    您正在尝试将不同类型的值分配给 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,
                    ...
                };