Linq-запрос Объединить объекты с разными источниками данных? - PullRequest
1 голос
/ 17 октября 2010

Я пытаюсь объединить два объекта, первый - это (статический) локальный объект, определенный в помощнике, а второй (дозвуковой) объект базы данных.

Вот неправильная выдержка из моего репозитория, я не будуутомляли вас моделями и помощниками, если их не просили.

public IQueryable GetData (string DataType) {

        IQueryable<DatabaseObject> datalist = (
            from t in db.All<DatabaseObject>()
            join e in WebHelpers.LocalList.AsQueryable<LocalObject>()
            on t.Type equals e.Type
            orderby t.DateOccurred descending
            select t
        ).Where(e => e.Category == TransType);

        return datalist;
    }

Я понимаю, что могу облегчить свою жизнь в 1000 раз, поместив эту таблицу вбазы данных, и для следующего выпуска я вполне могу сделать это.Но есть ли способ достичь того, что я пытаюсь сделать?Я думаю, это либо (а) я не возвращаю правильный тип данных, так как модель представления ожидает IQueryable, либо (б) Subsonic вызывает проблему.

Ответы [ 2 ]

2 голосов
/ 17 октября 2010

Боюсь, что SubSonic не поддерживает этот вид перекрестных ссылок (по крайней мере, это было не в прошлый раз, когда я пытался).

Вы можете обойти это, используя SubSonic только для извлечения необходимых данных из базы данных, но затем выполните соединение в обычном C # Linq-to-Objects:

public IQueryable GetData(string DataType)
{
    // Get a list of the types we need
    var requiredTypes = WebHelpers.LocalList.Select(l => l.Type)
                                  .Distinct().ToArray();

    // Retrieve all the relevant rows from the database
    var dbData = db.All<DatabaseObject>()
                                  .Where(d => requiredTypes.Contains(d.Type))
                                  .ToArray();

    // Do the join locally
    return (
        from t in dbData
        join e in WebHelpers.LocalList
        on t.Type equals e.Type
        orderby t.DateOccurred descending
        select t
    ).Where(e => e.Category == TransType);
}

(Кстати, вы, вероятно, сможете добиться большей производительности, если переместите .Where() выше orderby, потому что тогда будет меньше сортировки. Возможно, вы даже сможете включить ее в запрос к базе данных (тот, который извлекает dbData). Я не могу точно сказать, потому что ваш код сбивает с толку, потому что он ссылается на TransType, который вы нигде не объявили, а метод имеет параметр DataType, который нигде не используется, и вы используете t и e противоречиво.)

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

Мое окончательное решение состояло в том, чтобы реорганизовать предложения where, чтобы гарантировать, что выборка возвращает только правильный тип данных (IQueryable). Без реорганизации предложений where данные соединения по-прежнему передаются через объект, несмотря на указание select t .

public IQueryable GetData(string DataType)
{

     IQueryable<DatabaseObject> dbData = (
        from t in db.All<DatabaseObject>().Where(e => e.Category == TransType)
        join e in WebHelpers.LocalList
        on t.Type equals e.Type
        orderby t.DateOccurred descending
        select t
    ); 

    return dbData;
}
...