сложный запрос с использованием LINQ и C # - PullRequest
0 голосов
/ 31 января 2009

У меня очень большая проблема, решающая эту проблему У меня 2 таблицы

первая таблица: http://lh3.ggpht.com/_uMvfbnPHuko/SYPJQ1ZsBDI/AAAAAAAAAKs/eq49xquy3jM/s800/Untitled-2.jpg

, который содержит модули (идентификатор и имя)

второй стол http://lh6.ggpht.com/_uMvfbnPHuko/SYPJQ4IXGwI/AAAAAAAAAK0/zmTIO6V-UEQ/s800/Untitled-3.jpg

, который содержит идентификаторы пользователей и номера их предпочитаемых модулей

теперь давайте перейдем к проблеме Я хочу создать список флажков

например, для идентификатора пользователя 1, который имеет следующие модули "3,2 и 4" результат будет

http://lh4.ggpht.com/_uMvfbnPHuko/SYPJQ_LJeVI/AAAAAAAAAK8/6RV8a1S8eCY/s800/Untitled-4.jpg

обратите внимание, что флажок "рекомендуется для вас" не установлен, поскольку у пользователя 1 нет идентификатора модуля "1"

Я потратил много времени, пытаясь решить эту проблему, используя c # и LINQ

посмотрите результат моих усилий :) (следующий код не работает)

    var q = from m in db.modules
            from um in db.usersModules.Where(um2 => um2.userId == myUserId).Single().modules.Trim().Split(',')
            where um.Contains(m.moduleId.ToString())
            select new
            {
                moduleid = here i want the module id from modules table
                modulename = here i want the modulename from modules table
                ischecked = here i want "true" or "false" depending on if the user has this module or not

            };

Если LINQ для вас прост, пожалуйста, попробуйте решить эту проблему? есть вопросы?

Ответы [ 5 ]

2 голосов
/ 31 января 2009

Ваш запрос не работает, потому что LinqToSQL пытается перевести все на простой SQL.

Если вы не можете реорганизовать свою схему и использовать промежуточную таблицу, так как у вас явно есть отношение «многие ко многим», вы можете сделать что-то вроде этого:

var userModules = db.userModules.SingleOrDefault(m => m.userId == myUserId).modules;
// Get the modules of the user (a comma delimited string)
var integerModules = modules.Split(',').Select(m => int.Parse(m));
// Convert the comma delimited string to IEnumerable<int>

var query = db.modules.Select(x => new {
                x.moduleId,
                x.moduleName,
                isChecked = integerModules.Contains(x.moduleId)
}); // And finally do the query
1 голос
/ 31 января 2009

Если вы можете, может быть лучше реорганизовать ваши таблицы, чем пытаться обрабатывать данные в том формате, в котором они находятся.

В вашей таблице "usersModule", если вы измените столбец модулей на "moduleId" и просто вставите запись для каждого модуля, связанного с userId, вам будет намного проще запрашивать данные, которые, как я считаю, и вашу базу данных. будет намного проще в обслуживании.

Table: "modules"
moduleId    moduleName
1           Recommended...
2           Blah
3           ...

Table: "usersModule"
userId      moduleId
1           3
1           2
1           4
1 голос
/ 31 января 2009

Почему вы используете разделенный запятыми список? Лучшим подходом было бы иметь таблицу между ними, в которой хранится отображение между пользователями и модулями.

0 голосов
/ 31 января 2009

Я думаю, что-то вроде этого, но вы не предоставили достаточно точной информации о структуре вашей базы данных, чтобы я мог точно написать запрос.

var q =
    from m in db.modules
    select new {
        m.moduleId,
        m.name,
        db.usersModules.Exists(um => um.userId == myUserId)
    };

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

0 голосов
/ 31 января 2009

Если это вариант, вы можете реорганизовать схему базы данных. Ваша таблица usersModule должна иметь один идентификатор пользователя и один идентификатор модуля на строку, а столбец moduleId должен быть внешним ключом таблицы модулей. Если вы сделаете это таким образом, запрос linq будет тривиальным.

Если вы застряли с базой данных как есть, вы, вероятно, застряли, используя два запроса: один запрос для получения идентификаторов модуля и другой запрос для получения фактической информации о модуле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...