EF 拉姆达 linq if else (整理)
首先想到:
var data0 = db.T_Plants2; //这里加.AsQueryable() if (locationType == 1) { .Where(d => d.NaturalEcosystem == true); } else { .Where(d => d.BuiltUpArea == true); } .Select(d => new { AnimalID = d.PlantID, Species = d.Species, }).ToList();
然而以上想法的结果是不正确的!
正确方式:
一、纳姆达方式
var data0 = db.T_Plants2.AsQueryable(); //这里加.AsQueryable() if (locationType == 1) { data0= data0.Where(d => d.NaturalEcosystem == true); } else { data0 = data0.Where(d => d.BuiltUpArea == true); } var data2= data0.Select(d => new { AnimalID = d.PlantID, Species = d.Species, }).ToList();// 这里Iqueryable 无法转化为list必须用新对象data2接收;
三元表达式:
//var data2 = db.T_Plants2
// .Where(d=> locationType == 1 ? d.NaturalEcosystem == true : d.BuiltUpArea == true)
// .Select(d => new //{ // AnimalID = d.PlantID, // Species = d.Species, // Genus = d.Genus, // Family = d.Family //}).ToList();
二、Linq方式
简单应用
static void Main(string[] args) { var Spottingname = "112"; var plateno = "222"; var processid = "c8b79051249940acbeca5dd951d2c168"; DataBaseConnect(); List<PUNISH_ILLEGALVEHICLE_REALModel> pulist = new List<PUNISH_ILLEGALVEHICLE_REALModel>(); using (IRepository<PUNISH_ILLEGALVEHICLE_REALModel> repository = RepositoryManager.CreateRepository<PUNISH_ILLEGALVEHICLE_REALModel>()) { var list = repository.GetModels().ToList(); //DataTable dt = ListToDt<PUNISH_ILLEGALVEHICLE_REALModel>(list); var q = from u in list select u; if (!string.IsNullOrEmpty(Spottingname)) { q = q.Where(p => p.Spottingname == Spottingname); } if (!string.IsNullOrEmpty(plateno)) { q = q.Where(p => p.plateno == plateno); } if (!string.IsNullOrEmpty(processid)) { q = q.Where(p => p.processid == processid); } list = q.ToList(); //上边的所有if,只有到此处才会执行 } }
复杂应用
//案例一
from p in db.products
select new
{
Owner = (p.price > 0 ?
from q in db.Users select q.Name :
from r in db.ExternalUsers select r.Name)
}
//案例二
from p in db.products
if p.price>0
select new
{
Owner=from q in db.Users
select q.Name
}
else
select new
{
Owner = from r in db.ExternalUsers
select r.Name
}
//案例三
private string getValue(float price)
{
if(price >0)
return "debit";
return "credit";
}
select new {p.PriceID, Type = getValue(p.Price)};
三、拓展
简单版:
//对某一字段的查询,查询关键字是两个或两个以上的字符串,但查出来的相邻两个关键字的间距必须在20个字符以内 void Main() { var keys = new List<string>(); keys.Add("女子"); keys.Add("须发"); // keys.Add("如男子"); var filters = new List<System.Linq.Expressions.Expression<Func<LINQPad.User.CM_BookPageDetail, bool>>>(); foreach(var key in keys) filters.Add(item=>item.Content.Contains(key)); for(var i=0;i<keys.Count ;i++) { if(i>0) { var lastKey = keys[i-1]; var currentKey = keys[i]; filters.Add(item=> item.Content.IndexOf(currentKey) - item.Content.IndexOf(lastKey) < 20); } } var query = from item in CM_BookPageDetails select item; foreach(var filter in filters) query = query.Where(filter); query.Take(10).Dump(); }
复杂应用:重构 where、orderby 方法、建立filter模型
https://www.cnblogs.com/hao-1234-1234/p/9647322.html#4225885
参考文章
http://www.it1352.com/401595.html
https://www.cnblogs.com/macT/p/11641522.html
https://stackoverflow.com/questions/443044/if-else-in-linq
https://q.cnblogs.com/q/73479/
树立目标,保持活力,gogogo!