实现Join(...)扩展方法的问题

时间:2010-10-18 19:22:55

标签: c# linq-to-sql join linq-to-objects

我正在尝试使用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;但是,这似乎会给我带来与现在相同的错误。

有什么想法吗?

1 个答案:

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