【问题标题】:How do I add a where filter using the original Linq-to-SQL object in the following scenario如何在以下场景中使用原始 Linq-to-SQL 对象添加 where 过滤器
【发布时间】: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&lt;MovementSummary&gt;。我假设它已经变成了这个,因为我正在返回一个IEnumerable&lt;MovementSummary&gt;。我才刚开始学习 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


    【解决方案1】:

    您必须在触发 select 语句之前调用 where 语句,例如:

    IQueryable<Tbl_Movement> movements = context.Tbl_Movement;
    if (filter != null)
    {
       if (filter.PersonId != null) movements = movements.Where(m => m....PersonId == filter.PersonId);
       if (filter.RegionId != null) movements = movements.Where(m => m....RegionId == filter.RegionId);
       if (filter.SiteId != null) movements = movements.Where(m => m...SiteId == filter.SiteId);
       if (filter.AssetId != null) movements = movements.Where(m => m...AssetId == filter.AssetId);
    }
    
     var query = m from movements...
    

    与使用此 IFilter 类相反,您可能需要考虑使用 Fluent Pipe-based Repository 结构,例如:

    var movements = new MovementsPipe()
        .FindSiteId(1)
        .FindAssetIds(1, 2, 3)
        .FindRegionId(m => m > 10)
        .ToMovementSummaryList();
    

    希望这会有所帮助。如果您有任何问题,请告诉我。

    【讨论】:

    • 嗨,您的第一个示例不起作用:“无法将类型 'System.Linq.IQueryable' 隐式转换为 'System.Data.Linq.Table'" 有什么想法吗?
    • 我的错误。 Table 运动应该是 IQueryable,并且您使用的方法应该可能返回 IList 或 MovementSummary 数组。
    • 你打赌。祝 Linq 好运。 :)
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多