【发布时间】:2010-05-09 20:14:10
【问题描述】:
我正在使用以下 Linq 表达式执行选择查询:
Table<Tbl_Movement> movements = context.Tbl_Movement;
var query = from m in movements
select new MovementSummary
{
Id = m.DocketId,
Created = m.DateTimeStamp,
CreatedBy = m.Tbl_User.FullName,
DocketNumber = m.DocketNumber,
DocketTypeDescription = m.Ref_DocketType.DocketType,
DocketTypeId = m.DocketTypeId,
Site = new Site()
{
Id = m.Tbl_Site.SiteId,
FirstLine = m.Tbl_Site.FirstLine,
Postcode = m.Tbl_Site.Postcode,
SiteName = m.Tbl_Site.SiteName,
TownCity = m.Tbl_Site.TownCity,
Brewery = new Brewery()
{
Id = m.Tbl_Site.Ref_Brewery.BreweryId,
BreweryName = m.Tbl_Site.Ref_Brewery.BreweryName
},
Region = new Region()
{
Description = m.Tbl_Site.Ref_Region.Description,
Id = m.Tbl_Site.Ref_Region.RegionId
}
}
};
我还将一个 IFilter 类传递给执行此选择的方法。
public interface IJobFilter
{
int? PersonId { get; set; }
int? RegionId { get; set; }
int? SiteId { get; set; }
int? AssetId { get; set; }
}
如何将这些 where 参数添加到我的 SQL 表达式中?最好我希望以另一种方法完成此操作,因为过滤将在多个存储库中重复使用。
不幸的是,当我使用query.Where 时,它变成了IQueryable<MovementSummary>。我假设它已经变成了这个,因为我正在返回一个IEnumerable<MovementSummary>。我才刚开始学习 LINQ,所以要温柔。
答案:
private IQueryable<Tbl_Docket> BuildQuery(IQueryable<Tbl_Docket> movements, IMovementFilter filter)
{
if (filter != null)
{
if (filter.PersonId.HasValue) movements = movements.Where(m => m.UserId == filter.PersonId);
if (filter.SiteId.HasValue) ...
}
return movements;
}
如下调用:
var query = from m in this.BuildQuery(movements, filter)
select new... {}
【问题讨论】:
标签: linq linq-to-sql iqueryable