最近做项目用到linq 网上找示例东拼西凑 麻烦 刚好有段代码很多语法都用到了 就贴出来跟大家分享一下
//这里得到将要查询的数据集 List DataTable 都行
List<Model.ProjectSaleInfo> psiList ;
List<Model.StoreSystem> ssList ;
List<Model.City> cityList ;
List<Model.ProjectSaleDetail> psdList;
List<Model.KeyValueList> kvlList;
//在进行linq查询之前 一定要先判断要查询集是否为null
if (psiList == null || ssList == null || cityList==null||psdList==null||psdList==null||kvlList==null)
{
return;
}
try
{
//动态给linq添加where条件 由于只找到单张表动态条件的列子 所以在联合查询前先单张表过滤 先把问题解决了 以后找找看看多表的动态条件
psiList = (from psi in psiList select psi).AsQueryable<Model.ProjectSaleInfo>().Where(psi => psi.ProjectID == ProjectID).ToList<Model.ProjectSaleInfo>();
if (Framework.Utils.IsDateString(txtDate.Text))
{
DateTime minDate = DateTime.Parse(txtDate.Text);
psiList = (from psi in psiList select psi).AsQueryable<Model.ProjectSaleInfo>().Where(psi => psi.WorkDate >= minDate).ToList<Model.ProjectSaleInfo>();
}
if (Framework.Utils.IsDateString(TextBox1.Text))
{
DateTime maxDate = DateTime.Parse(TextBox1.Text);
psiList = (from psi in psiList select psi).AsQueryable<Model.ProjectSaleInfo>().Where(psi => psi.WorkDate <= maxDate).ToList<Model.ProjectSaleInfo>();
}
//多表左连接查询
var data = (from psi in psiList
join ss in ssList on psi.ShopID equals ss.StoreSystemID into psiss
from s in psiss.DefaultIfEmpty(new Model.StoreSystem { StoreSystemName = null })
join city in cityList on s.CityID equals city.CityID into psicity
from c in psicity.DefaultIfEmpty(new Model.City { CityID = null, CityName = null })
join psd in psdList on new { a = psi.WorkDate.HasValue ? "" : psi.WorkDate.ToString(), b = Convert.ToInt32(psi.ShopID), c = psi.ProjectID } equals new { a = psd.WorkDate.HasValue ? "" : psd.WorkDate.ToString(), b = Convert.ToInt32(psd.ShopID), c = psd.ProjectID } into psipsd
from p in psipsd.DefaultIfEmpty(new Model.ProjectSaleDetail { GroupBuyCount = -1, IsOutStock = -1, ProductName = null })
join kvl in kvlList on psi.IsDisplay equals kvl.DataKey into psikvl
from k in psikvl.DefaultIfEmpty(new Model.KeyValueList { DataValue = null, KeyValueDesc = null })
orderby psi.WorkDate
select new
{
c.CityName,
s.StoreSystemName,
psi.WorkDate,
p.GroupBuyCount,
p.IsOutStock,
p.ProductName,
psi.IsDisplay,
k.DataValue,
psi.IsStack
});
//循环组装table
foreach (var d in data)
{
}
一些有关的ling数据转换的方法
代码
public static System.Data.DataTable LinqToDataTable<T>(IEnumerable<T> data)
{
var dt = new System.Data.DataTable();
var ps = typeof(T).GetProperties().ToList();
ps.ForEach(p => dt.Columns.Add(p.Name, p.PropertyType));//这里如果报“DataSet 不支 System.Nullable<>。” 的错误 就去掉p.PropertyType
//写成 ps.ForEach(p => dt.Columns.Add(p.Name));
foreach (T t in data)
{
var dr = dt.NewRow();
var vs = from p in ps select p.GetValue(t, null);
var ls = vs.ToList(); int i = 0; ls.ForEach(c => dr[i++] = c); dt.Rows.Add(dr);
}
return dt;
}

浙公网安备 33010602011771号