C# linq 多表关联

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# linq 多表关联相关的知识,希望对你有一定的参考价值。

var invs = dt发货通知单_副本.AsEnumerable();
var carts = dt每托箱数.AsEnumerable();
var query = from mix in
(from inv in invs
join cart in carts
on new 组托ID = inv.Field<Int32>("组托ID"), 外盒 = inv.Field<string>("外盒"), 托盘ID = inv.Field<Int32>("托盘ID")
equals new 组托ID = cart.Field<Int32>("组托ID"), 外盒 = cart.Field<string>("外盒"), 托盘ID = cart.Field<Int32>("托盘ID")
select new
是否存厂 = inv.Field<Int32>("是否存厂"),
装箱地点 = inv.Field<string>("装箱地点"),
销售ID = inv.Field<Int32>("销售ID"),
每托箱数 = cart.Field<decimal>("每托箱数"),
组托ID = inv.Field<Int32>("组托ID"),
箱数 = inv.Field<decimal>("箱数")
)
group mix by new
是否存厂 = mix.是否存厂,
装箱地点 = mix.装箱地点,
销售ID = mix.销售ID,
每托箱数 = mix.每托箱数
into g
select new g.Key,
箱数总计 = g.Sum(inv => inv.箱数),
每托箱数 = g.First().每托箱数,
组托ID = g.First().组托ID,
销售ID = g.First().销售ID
;
请教以下,问什么会报这个错误呢?

想要实现以下类型的sql:
select sum(表A.箱数) as 箱数总计,表B.每托箱数,表A.销售ID
from 表A inner join 表B on 表A.组托ID=表B.组托ID and 表A.外盒=表B.外盒 and 表A.托盘ID=表B.托盘ID
group by 表A.是否存厂,表A.装箱地点,表A.销售ID,表B.每托箱数
having sum(表A.箱数) % 表B.每托箱数==0
order by 表A.销售ID

    AsEnumerable();这步有问题,既然你是要进行查询操作,应该转AsQueryable()

    检查你new 出来匿名函数时,源数据的正确性,看是不是内容跟格式对不上。

    既然你是要做sql查询,为什么不用EF实体模型去做呢?非要再转换一次。

追问

不使用EF实体模型,是因为数据抽出后,经由用户修改之后再进行此类操作,所以我这里是抽出至datatable后再做处理,且中途修改的内容不需要保存至表中
另外,ef实体模型我查到的都是用于网页的,winform是否也可以用?

追答

可以用,尝试一下实体模型吧,直接针对对象操作,绝对跟datatable不一样。

参考技术A string str="";
实体模型 db=new 实体模型();
var qq= db.a.Where(p => p.Name == str).Select(m => new 实体模型.b()

Time = m.Time,
area = m.area,
tel = m.tel,
ip = m.ip,
);
参考技术B var invs = dt发货通知单_副本.AsEnumerable();

c# Linq left join 多个条件连接查询

如下面的sql 用查询表达式怎么写?
SELECT A.*,B.ITEM_NAME AS MoneyType_DESC,C.ITEM_NAME AS PayMentType_DESC,D.ITEM_NAME AS ApplyType_DESC
FROM DFZFORMT055 A
LEFT JOIN FM_CODE_LIST B ON A.MoneyType = B.ITEM_VALUE AND B.FORM_KIND = 'DFZ.FORM.T055' AND B.FIELD_NAME= 'MoneyType'
LEFT JOIN FM_CODE_LIST C ON A.PayMentType = C.ITEM_VALUE AND C.FORM_KIND = 'DFZ.FORM.T055' AND C.FIELD_NAME= 'PayMentType'
LEFT JOIN FM_CODE_LIST D ON A.APPLYTYPE = D.ITEM_VALUE AND D.FORM_KIND = 'DFZ.FORM.T055' AND D.FIELD_NAME= 'ApplyType'
WHERE A.form_no=9
自己搞定了,还是要谢谢 w362435819和 fansui1983
var query = from MainTable in T055
join B in (from codelist in CODELIST where codelist.FORM_KIND=="DFZ.FORM.T055" &&codelist.ITEM_NAME=="MoneyType" select codelist)
on MainTable.MoneyType equals B.ITEM_VALUE into B_Join
from BB in B_Join.DefaultIfEmpty()
join C in (from codelist in CODELIST2 where codelist.FORM_KIND == "DFZ.FORM.T055" && codelist.ITEM_NAME == "PayMentType" select codelist)
on MainTable.PayMentType equals C.ITEM_VALUE into C_Join
from CC in C_Join.DefaultIfEmpty()
join D in ....
where MainTable.FORM_NO == m_intFormNo

参考技术A 这代码看的晕啊....
一般 linq 连接用的是 from a in A jion b in B on ....条件
外连接用的是 from a in A jion b in B on ....条件 into C from a in C.DefaultIfEmpty()
参考技术B from A in DFZFORMT055 join B in FM_CODE_LIST on
A.MoneyType = B.ITEM_VALUE AND B.FORM_KIND = 'DFZ.FORM.T055' AND B.FIELD_NAME= 'MoneyType'
join C in JOIN FM_CODE_LIST on
A.PayMentType = C.ITEM_VALUE AND C.FORM_KIND = 'DFZ.FORM.T055' AND C.FIELD_NAME= 'PayMentType'

join D in FM_CODE_LIST on
A.APPLYTYPE = D.ITEM_VALUE AND D.FORM_KIND = 'DFZ.FORM.T055' AND D.FIELD_NAME= 'ApplyType'

where A.form_no=9
select A追问

不行,报错。DFZFORMT055为主表,FM_CODE_LIST为下拉菜单的数据存储表,以FORM_KIND,FIELD_NAME两栏位确定是那一下拉菜单的数据,ITEM_NAME,ITEM_VALUE为下拉菜单的值和显示名。
请表栏位:MoneyType ,PayMentType ,APPLYTYPE 为存储拉菜单值,但不一定会存入,所以就用left join 查找主管中的数据及下拉菜单有储存值的数据名。写sql很简单实现,后来改成linq实现就绑手绑脚的,又找不到相关的资料,还请各位高手多多指点。

本回答被提问者和网友采纳

以上是关于C# linq 多表关联的主要内容,如果未能解决你的问题,请参考以下文章

yii2 ActiveRecord多表关联以及多表关联搜索的实现

yii2 ActiveRecord多表关联以及多表关联搜索的实现

Elasticsearch es join 多表关联如何设计

sql 多表关联查询

oracle02--多表关联查询

yii2 ActiveRecord多表关联以及多表关联搜索的实现