繁体   English   中英

使用LINQ和C#的复杂查询

[英]complex query using LINQ and C#

我有一个很大的问题要解决,我有2张桌子

第一个表格是: http : //lh3.ggpht.com/_uMvfbnPHuko/SYPJQ1ZsBDI/AAAAAAAAAKs/eq49xquy3jM/s800/Untitled-2.jpg

其中包含一个模块(ID和名称)

第二个表是http://lh6.ggpht.com/_uMvfbnPHuko/SYPJQ4IXGwI/AAAAAAAAAK0/zmTIO6V-UEQ/s800/Untitled-3.jpg

其中包含用户ID及其首选模块的编号

现在让我们转到我要生成复选框列表的问题

例如,对于具有以下模块“ 3,2和4”的用户ID 1,结果将是

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

请注意,未选中“为您推荐”复选框,因为用户1没有模块ID“ 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对您来说很简单,请尝试解决这一问题? 任何问题?

您的查询无效,因为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

您如何使用逗号分隔的列表? 更好的方法是在表之间存储用户和模块之间的映射。

如果可以的话,最好重构表,而不要尝试以其格式处理数据。

在您的“ usersModule”表中,如果将modules列更改为“ moduleId”,并为与userId关联的每个模块插入一条记录,您将可以更轻松地查询我相信的数据,并且数据库将易于维护。

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

Table: "usersModule"
userId      moduleId
1           3
1           2
1           4

如果可以选择,则可能需要重构数据库架构。 您的usersModule表应每行具有一个用户ID和一个模块ID,而moduleId列应为模块表的外键。 如果以这种方式执行,则linq查询将变得微不足道。

如果您按原样使用数据库,则可能会使用两个查询:一个查询用于检索模块ID,另一个查询用于检索实际模块信息。

我想应该是这样的,但是您没有提供足够的有关数据库结构的准确信息,我无法准确地编写查询。

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

编辑:哦,我刚刚意识到您有逗号分隔的内容。 像其他人所说的那样,首先要正确地重新排列数据库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM