c# linq 左连接
最简单事例:
var query = from order in orders join customer in customers on order.CustomerID equals customer.CustomerID group order by customer.Country into g select new { Country = g.Key, Total = g.Sum(o => o.Total) };
以前例:
List<ReceivingNote> itemDetails = new List<ReceivingNote>(); var warningData = (from t in itemDetails group t by new { t.BoxNo } into grp select new { grp.Key.BoxNo, Quantity = grp.Count() }).Where(r => r.Quantity > 1); int intDistinctDataCount = warningData.Count(); if (intDistinctDataCount > 0) { string alterMes = "导入文件存在【{0}】组“XX”重复!,请检查导入文件。\n第一组 XX:{1}"; alterMes = string.Format(alterMes, intDistinctDataCount, warningData.ToList()[0].BoxNo); Alert.Show(alterMes); return false; }
将上面代码转成具体实体
List<WarningDataEntity> warningData = (from t in itemDetails
group t by new { t.BoxNo }
into grp
select new WarningDataEntity
{
BoxNo= grp.Key.BoxNo,
CountVue = grp.Count()
}).Where(r => r.CountVue > 1).ToList< WarningDataEntity>();
var todayFinish = ds.Tables[0].AsEnumerable();
var listTodayFinish = todayFinish
.Select(p => new TodayFinishRate
{
RequireDate = p.Field<DateTime>("RequireDate").ToString("HH:mm"),
PickStatus = p.Field<int?>("PickStatus").ToString()
}).ToList();
//按需求时间 汇总 出已经完成出货的记录。
var GroupTodayFinish = from a in listTodayFinish
where a.PickStatus == "1"
group a by new { a.RequireDate } into g
select new TodayFinishRate
{
RequireDate = g.Key.RequireDate,
FinishCount = g.Count()
};
//按需求时间 汇总 出已经今天全部叫料记录。
var GroupTodayFinishAll = from a in listTodayFinish
group a by new { a.RequireDate } into g
select new TodayFinishRate
{
RequireDate = g.Key.RequireDate,
AllCount = g.Count()
};
var listResult = from all in GroupTodayFinishAll
join a in GroupTodayFinish on all.RequireDate equals a.RequireDate into LeftTmp
from tmp in LeftTmp.DefaultIfEmpty()
select new TodayFinishRate
{
RequireDate = all.RequireDate,
FinishCount = tmp==null?0:tmp.FinishCount, //这个判断很重要,不然报错,因为tmp可能为null
AllCount = all.AllCount
};
过滤取最大值
var listType = new string[]{"提货点已到达","已提货","卸货点已到达" };
DateTime? dtDaoDa = itemList.Where(x => listType.Contains(x.Remark) && x.AddressDescr==txtAddress.Text.Trim()).Max(x=>x.CreateOn);