【问题标题】:Multiple Where clauses in query using EF in C#在 C# 中使用 EF 进行查询中的多个 Where 子句
【发布时间】:2018-07-18 20:28:02
【问题描述】:

我有两个 IQueryable 查询:

IQueryable<Ad> list1 = db.Ads.Where(x=>x.isModerated == true);
IQueryable<Ad> list2;

if(something == true)
{
    list2 = list1.Where(x=>x.TypeId == 2) 
    // is it going to be the same as query below?
    IQueryable<Ad> list1 = db.Ads.Where(x=>x.isModerated == true && x.TypeId == 2)   
}

如果我想使用 OR (||) 运算符获取数据,情况相同。

而且我相信这将是一个数据库调用,直到我想迭代这个查询。对?

【问题讨论】:

标签: c# entity-framework iqueryable


【解决方案1】:

会和下面的查询一样吗?

是的

如果我想使用 OR (||) 运算符获取数据怎么办。

这样做的资源成本要低得多:

IQueryable<Ad> list1 = db.Ads.Where(x=>x.isModerated);
IQueryable<Ad> list2;

if(something == true)
{
    list2 = list1.Where(x=>x.TypeId == 2) 
}
else 
{
    list2 = db.Ads.Where(x=>x.isModerated  || x.TypeId == 2)  
}

但如果由于某种原因你不想这样做,你可以这样做:

list2 = list1.Union(db.Ads.Where(x=> x.TypeId == 2)) 

会给你相同的结果集

【讨论】:

    【解决方案2】:

    正如我所注意到的,您确实有一个带有名为 list1 的 where 子句的查询,如果您确实有相同的内容,您将添加另一个 where 子句,这样我会采取一种更精简、更简单的方法。

    IQueryable<Ad> list1 = db.Ads.Where(x => (x.isModerated == true) && (something != true || x.TypeId == 2));
    
    List<Ad> fetchedAds = list1.ToList();
    

    【讨论】:

      【解决方案3】:
      list2 = list1.Where(x=>x.TypeId == 2) 
      // is it going to be the same as query below?
      IQueryable<Ad> list1 = db.Ads.Where(x=>x.isModerated == true && x.TypeId == 2)  
      

      是的 - 它会是一样的。

      【讨论】:

      • 是的,除非您枚举它,否则它将是一个数据库调用。
      猜你喜欢
      • 2017-06-26
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      相关资源
      最近更新 更多