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方式

//案例一

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://stackoverflow.com/questions/443044/if-else-in-linq

https://q.cnblogs.com/q/73479/

原文地址:https://www.cnblogs.com/hao-1234-1234/p/11271672.html