Linq 请教多表查询的一个问题

f346444180 2017-09-12 04:34:21
先说问题需求
有A表question,和B表Subject
表A字段:AID(主键自增),percent(百分比) ,CID(父类ID)
AID percent CID
1 30 1
2 30 1
3 40 1
表B字段:BID(主键自增),BName(标题),,,AID(A表ID)
BID BName ........ AID
1 '第1条' ........ 1
2 '第2条' ........ 1
3 '第3条' ........ 1
4 '第4条' ........ 1
5 '第5条' ........ 2
6 '第6条' ........ 2
7 '第7条' ........ 2
8 '第8条' ........ 2
9 '第9条' ........ 3
10 '第10条' ........ 3
11 '第11条' ........ 3
12 '第12条' ........ 3
13 '第13条' ........ 4
需求
我想随机取cid=1的10道题的所有数据。
然后要按照A表设置好的比例来随机抽题

不知道linq里可不可以实现,或者实现的关键代码或者详细思路是什么。
请各位大神指点下
...全文
1392 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2017-09-13
  • 打赏
  • 举报
回复
引用 12 楼 f346444180 的回复:
@以专业开发人员为伍 我仔细研究了下p哥说的,在这个需求里把数据库中的记录加载在内存里来进行二次查找确实有点不合适,我的题库表里可能会有几千条数据,全都加在listb里在查询太耗性能。主要怪我给出的问题没说详细。版主大大给出的思路实现起来简单但是放在我的项目里会丢掉性能为代价,不太合适。谢谢P哥指点。
没关系的。sp1234只是告诉你,不要全部加在数据,这和linq其实并不冲突。 你的A和B表,如果是基于ef之类的,那完全可以通过上下文.表名修改下面的语句 语句其实类似如下 var o = dbcontext.listb.Join(lista, b => b.aid, a => a.aid, (b, a) => new { b.bid,b.aid, b.bname, a.percent }) .GroupBy(x => x.aid) .SelectMany(t => t.OrderBy(x=>Guid.NewGuid()).Select((b, i) => new { b.aid,b.bid,b.bname,b.percent, i })).Where(x=>x.i+1<=x.percent/10).ToList(); 这样不会是操作一个 list,而是操作一个 dbset<T>, 在tolist之前。应该都产生的是IQueryable<T>类型。 而这个类型不会缓存数据,而是会产生一个sql语句放到数据库执行。
f346444180 2017-09-13
  • 打赏
  • 举报
回复
引用 7 楼 hanjun0612 的回复:
我估计有更简单的方法,但是我还没想到。 如果分开来获取,那遍历一下根据percent来获取对应条数,可能更容易写。
@以专业开发人员为伍 我仔细研究了下p哥说的,在这个需求里把数据库中的记录加载在内存里来进行二次查找确实有点不合适,我的题库表里可能会有几千条数据,全都加在listb里在查询太耗性能。主要怪我给出的问题没说详细。版主大大给出的思路实现起来简单但是放在我的项目里会丢掉性能为代价,不太合适。谢谢P哥指点。
f346444180 2017-09-13
  • 打赏
  • 举报
回复
引用 9 楼 sp1234 的回复:
linq 既有可能是指 linq for object 也有可能是值数据库的 linq provider。你说的可能是后者。 看看你用的 linq provider(比如说你用 EF 或者别的)具体是如何处理多表关联查询的。在查询时,你不应该把数据库中的记录都加载到内存中来用 linq for object 来进行二次查找计算,而应该用 linq provider 的产生原生 sql 语句(或者比如说对于 c# for mongodb 就产生它的原生查询语句)去数据库里直接查询到多表关联和过滤查询的结果,只把最终结果取到内存里来。 如果linq provider 不行,那么就用你说的“存储过程”来实现查询也行。
谢谢p哥,您说的我理解的不是非常明白。linq刚开始接触正在学。打算着两种方式都写写试试。谢谢指点
f346444180 2017-09-13
  • 打赏
  • 举报
回复
再补充一下,我的问题描述里 有A表question,和B表Subject 这块写反了,希望以后有次问题的人不要被误导 - -,版主大大要是看见的话麻烦帮忙修改一下,我没权限。不好意思了
  • 打赏
  • 举报
回复
linq 既有可能是指 linq for object 也有可能是值数据库的 linq provider。你说的可能是后者。 看看你用的 linq provider(比如说你用 EF 或者别的)具体是如何处理多表关联查询的。在查询时,你不应该把数据库中的记录都加载到内存中来用 linq for object 来进行二次查找计算,而应该用 linq provider 的产生原生 sql 语句(或者比如说对于 c# for mongodb 就产生它的原生查询语句)去数据库里直接查询到多表关联和过滤查询的结果,只把最终结果取到内存里来。 如果linq provider 不行,那么就用你说的“存储过程”来实现查询也行。
f346444180 2017-09-13
  • 打赏
  • 举报
回复
引用 7 楼 hanjun0612 的回复:
我估计有更简单的方法,但是我还没想到。 如果分开来获取,那遍历一下根据percent来获取对应条数,可能更容易写。
恩,谢谢版主大大,昨天有别的需求需要修改没上来看这个,写了个简略版存储过程感觉还需要修改。还是先谢谢版主大大,看你的代码思路变得很清晰。谢谢
正怒月神 2017-09-12
  • 打赏
  • 举报
回复
我估计有更简单的方法,但是我还没想到。 如果分开来获取,那遍历一下根据percent来获取对应条数,可能更容易写。
正怒月神 2017-09-12
  • 打赏
  • 举报
回复
static List<A> lista = new List<A>()
{
new A(){aid=1,percent=30,cid=1},
new A(){aid=2,percent=30,cid=1},
new A(){aid=3,percent=40,cid=1},
};

static List<B> listb = new List<B>()
{
new B(){bid=1,bname="1t",aid=1},
new B(){bid=2,bname="2t",aid=1},
new B(){bid=3,bname="3t",aid=1},
new B(){bid=4,bname="4t",aid=1},
new B(){bid=5,bname="5t",aid=2},
new B(){bid=6,bname="6t",aid=2},
new B(){bid=7,bname="7t",aid=2},
new B(){bid=8,bname="8t",aid=2},
new B(){bid=9,bname="9t",aid=3},
new B(){bid=10,bname="10t",aid=3},
new B(){bid=11,bname="11t",aid=3},
new B(){bid=12,bname="12t",aid=3},
new B(){bid=13,bname="13t",aid=4},
};
static void Main()
{
var o = listb.Join(lista, b => b.aid, a => a.aid, (b, a) => new { b.bid,b.aid, b.bname, a.percent })
.GroupBy(x => x.aid)
.SelectMany(t => t.OrderBy(x=>Guid.NewGuid()).Select((b, i) => new { b.aid,b.bid,b.bname,b.percent, i })).Where(x=>x.i+1<=x.percent/10).ToList();

foreach (var item in o)
{
Console.WriteLine(item.aid+" "+item.bname);
}

Console.ReadLine();
}
正怒月神 2017-09-12
  • 打赏
  • 举报
回复
引用 4 楼 f346444180 的回复:
[quote=引用 2 楼 hanjun0612 的回复:] http://blog.csdn.net/hanjun0612/article/details/50563136
版主大大,您发给我的链接是个C#用递归生产树的例子啊,和我的貌似没什么关系啊,或者说我这个需求里怎么用递归来查数据。这块不明白[/quote] 抱歉我看错了。一眼扫过以为是递归问题。
f346444180 2017-09-12
  • 打赏
  • 举报
回复
引用 2 楼 hanjun0612 的回复:
http://blog.csdn.net/hanjun0612/article/details/50563136
版主大大,您发给我的链接是个C#用递归生产树的例子啊,和我的貌似没什么关系啊,或者说我这个需求里怎么用递归来查数据。这块不明白
f346444180 2017-09-12
  • 打赏
  • 举报
回复
引用 2 楼 hanjun0612 的回复:
http://blog.csdn.net/hanjun0612/article/details/50563136
谢谢版主大大,我先去学习一下
正怒月神 2017-09-12
  • 打赏
  • 举报
回复
http://blog.csdn.net/hanjun0612/article/details/50563136
f346444180 2017-09-12
  • 打赏
  • 举报
回复
补充说一下,子类AID的数量是随机的。不知道有多少个,自己给自己Mark一下

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧