使LINQ查询成为动态查询,以返回所有行或仅返回具有指向查找表的链接的行

本文关键字:返回 查询 查找 链接 LINQ 动态 | 更新日期: 2023-09-27 18:21:17

我有一个查询,它返回货币列表并联接到查找表。然后将结果放入一个类对象(运行良好):

 var queryforobject = from x in db.CurrencyExchangeRates.AsNoTracking()
                      join c in db.CurrencyTypes.AsNoTracking() on x.CurrencyTypeID equals c.ID
                      orderby x.ID
                      select new CurrencyExchangeRateObject 
                      { 
                          ID = x.ID, 
                          CurrencyID = c.ID, 
                          Currency = c.Description, 
                          ExchangeRate = x.ExchangeRate, 
                          LastEditedDate = x.LastEditedDate, 
                          LastEditedBy = x.LastEditedBy, 
                          Active = x.Active 
                      };

我想让它更动态,所以如果没有提供CurrencyTypeID,它将返回完整的列表(就像它已经做的那样)——否则,如果提供CurrencyTypeID,它将只显示X.CurrencyTypeID = ID的位置。

沿着内联if的线的东西?

使LINQ查询成为动态查询,以返回所有行或仅返回具有指向查找表的链接的行

如果提供了搜索值(在这个答案中称为currencyTypeID),则有一些选项可以根据CurrencyTypeID过滤查询,但如果没有提供currencyTypeID,则返回所有数据。

第一个选项:您可以在现有的查询表达式中添加where子句。如果为currencyTypeID变量传递了null,则下面的WHERE子句将返回数据集中的每条记录,否则它将过滤结果。

from x in db.CurrencyExchangeRates.AsNoTracking()
     join c in db.CurrencyTypes.AsNoTracking() on x.CurrencyTypeID equals c.ID
     where (currencyTypeID == null || x.CurrencyTypeID == currencyTypeID)
     orderby x.ID
select new CurrencyExchangeRateObject { 
       ID = x.ID, 
       CurrencyID = c.ID, 
       Currency = c.Description, 
       ExchangeRate = x.ExchangeRate, 
       LastEditedDate = x.LastEditedDate, 
       LastEditedBy = x.LastEditedBy, 
       Active = x.Active
     };

或者:由于queryforobject的类型为IQueryable<T>,因此可以使用LINQ的fluent API将WHERE子句附加到if语句中的查询中。不过,您需要更加小心这一次的计时,因为在使用foreach循环、.ToList().Select()或其他强制求值的LINQ方法强制求值IQueryable之前,需要进行计时。

if(currencyTypeID != null)
    queryforobject  = queryforobject.Where(cerObj => cerObj.CurrencyID == currencyTypeID);