Проблема реализации метода расширения Join (...) - PullRequest
1 голос
/ 18 октября 2010

Я пытаюсь использовать метод расширения 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, если это лучшее решение;однако, казалось бы, это даст мне ту же ошибку, что и сейчас.

Есть идеи?

1 Ответ

1 голос
/ 18 октября 2010

Вы пытаетесь присвоить различные типы значений переменной 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,
                ...
            };
...