请教linq多表左连接问题

ufo20020427 2016-10-24 03:11:28
我有三个表:productPackageInfo , storageDetail , storage
productPackageInfo 是左表,想先left join storageDetail ,接着 storage
写成sql就是
from productPackageInfo
left join storageDetail on productPackageInfo.字段 = storageDetail .字段
left join storage on storageDetail.字段 = storage.字段

由于 storageDetail 与 storage 先 inner join 的话,产生的集合会相当大,因为不想写成
from productPackageInfo
left join
(storageDetail inner join storage) 这样的形式。

以上业务用sql server是没有问题的,但是用linq总提示:未将对象引用设置到对象的实例

代码如下:


var listStorageStock = (from productPackageInfo in listProductPackageInfo
join storageDetail in db.T_Warehouse_StorageDetail.AsNoTracking()
on productPackageInfo.F_PackageBarcode equals storageDetail.F_PackageBarcode
into joinPackageStorageDetail
from storageDetail in joinPackageStorageDetail.DefaultIfEmpty()
join storage in db.T_Warehouse_Storage.AsNoTracking()
on storageDetail.F_StorageID equals storage.F_ID
into joinStorageInfoDetail
from storage in joinStorageInfoDetail.DefaultIfEmpty()
where storage.F_WarehouseID == warehouseID
&& storageType.Contains(storage.F_Type)
select new
{
F_ProductArchiveID = productPackageInfo.F_ProductArchiveID,
F_ProductBarcode = productPackageInfo.F_ProductBarcode,
F_PackageBarcode = productPackageInfo.F_PackageBarcode,
F_BatchNumber = productPackageInfo.F_BatchNumber,
F_PackageDetailQuantity = productPackageInfo.F_PackageDetailQuantity,
F_PackageDetailOutQuantity = productPackageInfo.F_PackageDetailOutQuantity,
F_StoragDetailQuantity = storageDetail == null ? 0 : storageDetail.F_Quantity,
F_StorageID = storage == null ? string.Empty : storage.F_ID,
F_StorageCode = storage == null ? string.Empty : storage.F_Code,
F_StorageIndex = storage == null ? 3 : ( storage.F_Type == StorageType.备货.ToString() ? 1 : 2)
}).ToList();



不知用linq的话,如何写。谢谢!
...全文
172 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ufo20020427 2016-10-24
  • 打赏
  • 举报
回复
@Chinajiyong 不是重复,第二个storageDetail 是位于from后面,而不是join后面。只是这变量名
EnForGrass 2016-10-24
  • 打赏
  • 举报
回复
而且select new里面你可以先写一个字段看看,依次添加字段看看是哪个对象为空?
EnForGrass 2016-10-24
  • 打赏
  • 举报
回复
你为什么要重复join呢? from productPackageInfo in listProductPackageInfo join storageDetail in db.T_Warehouse_StorageDetail.AsNoTracking() on productPackageInfo.F_PackageBarcode equals storageDetail.F_PackageBarcode into joinPackageStorageDetail from storageDetail in joinPackageStorageDetail.DefaultIfEmpty() join storage in db.T_Warehouse_Storage.AsNoTracking() on storageDetail.F_StorageID equals storage.F_ID into joinStorageInfoDetail from storage in joinStorageInfoDetail.DefaultIfEmpty() where storage.F_WarehouseID == warehouseID

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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