使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的线的东西?
如果提供了搜索值(在这个答案中称为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);