[英]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.