现在有两张表
table 1 :
id code
1 001
2 001,002
3 001,002,003
table 2:
code name
001 数学
002 体育
003 美术
要求结果
id name
1 数学
2 数学,体育
3 数学,体育,美术
我异想天开想这样。。果断出错了。。
var list = from o in table1 select new { o.id name = (from z in table2 where z.code in o.code.......) };
现在就是想要输出的这个list里面name不是001,002,这样的,而是直接变成 数学,体育 这样直接出来的数值。。用join没办法啊。不是一一对应的,这个该怎么办。。
要么你修改数据库设计,要么你用C#代码实现你要的功能,不要让数据库干这种事。
不对吧大叔,这设计没什么问题,大部分一对多的都这么设计,C#代码当然可以实现,问题是一个个拆开再取的查询效率肯定不能这样做,数据库就应该用来干一次查询这种事
@MayBreath: 买本《SQL Server 从入门到精通》,这是可以看几年的书。先看他半个月,以后当词典用。
SQL 语言几乎已经是编程语言里面最简单的,只是理解和设计不容易。
@爱编程的大叔: 大叔啊,知识本来就是学无止境,而术业是有专攻的啊,不然为啥还有个DBA职位呢。我用EF,就是为了独立和SQL分开的编程,如果不是非常专业的水平,写出来的语句还不如EF自动生成的高效哦,这边不是在讨论sql,是ef哦
@MayBreath: 不懂数据库,懂EF有个屁用。
@爱编程的大叔: 你这么浮躁的吗?人家楼下答案多完美,自己去看看EF是什么,还有人家disucz数据库怎么设计的再来吧
var l_obj = new List<Res>()
{
new Res{id="1",code="001"},
new Res {id="2",code="001,002"},
new Res {id="3",code="001,002,003"}
};
var l_subj = new List<Subject>()
{
new Subject {code="001",name="数学"},
new Subject {code="002",name="体育"},
new Subject{code="003",name="美术"}
};
var l_res = l_obj.Select(c => new
{
Id = c.id,
name = string.Join(",", (from t11 in c.code.Split(',')
from t22 in l_subj
where t11 == t22.code
select t22.name
).ToArray())
});
这样应该可以实现你的效果了吧
数据库:http://www.cnblogs.com/WangShuaishuai/p/9022952.html
后代代码拆分遍历数组:
string ids = "1,2,3"
string[] allid = ids.Split(',')
foreach(string id in allid){
}
你当字符串取出来,然后以 "," 号分割存到新的数组或者字典里就完了呗
存储过程了解一下
SELECT (SELECT group_concat(name SEPARATOR ',') as name from table2 where find_in_set(table2.code,table1.code)) as name,id FROM table1
设计很戳,你这明显是可预计个数的,不超过32状态,直接用uint枚举,不超过8个用byte,用位操作。效能上n个数量级,存储空间小n多,操作上也很方便。动不动就上string是特别垃圾的。看了ef,看数据库,再看看计算机基础。
给你我做权限跟一些人的差别:
这位大侠你是不是回错帖了
@MayBreath:
所以建议你需要看计算机原理。
[Flag]
enum CourseCatelog:byte
{
体育=0X01,
数学=0X02,
.....
}
为什么写Flag自己去查;
设置数学和体育的 = (0X01 & 0X02)
@花飘水流兮: 大侠谢谢。不过你说的好像和我不是一回事。2L已经解决了哦 谢谢~
@MayBreath: 看来你还是没看懂。以后非常有限的你这么设计就对了,然后去看看flag,代码写很少,关键什么效率都还高。