【问题标题】:c# linq let statement broken into pieces with a view modelc# linq let 语句用视图模型分解成碎片
【发布时间】:2021-12-09 07:42:08
【问题描述】:

好的,所以我正在尝试使用查询语法构建一个 linq 语句。我希望有更多的过滤条件功能,以及包含特定条件的最终多个配置。这里的流程有效


public async Task<IEnumerable<Shoe>> GetShoesByCriteria()
{
    IQueryable<Shoe> shoes = FilteredContext;
    shoes = FilterShoesByInsurance()
    return shoes.ToList();
}

private IQueryable<Shoe> FilterShoesByInsurance(IQueryable<Shoe> shoes,List<Guid> Insurer)
{
    var x = (from s in shoes
             let shoeInsurer = _insuranceContext.Context.FirstOrDefault(x=> x.ShoeID= s.ID
              && Insurer.Contains(s.Insurer.ID)
             )
             
             where shoeInsurer != null
             select m
             );

    return x;
}

最后,我希望有一个视图模型 ShoeViewModel,其中包含鞋类保险公司的水分。

有没有办法在为视图模型补水的同时随时随地构建这样的 iqueryables?我真的很想避免去不可枚举并导致多次往返,另外我想避免必须编写两次获得保险公司的逻辑

【问题讨论】:

  • 我应该补充一点,FIlteredContext 是一个 Iqueryable,通过 applicationdbcontext 可以让我访问 Shoes 表
  • 从查询语法切换到 fluent/lambda 语法,您可以将.Where() 方法调用以菊花链形式连接到IQueryable,只要过滤器被“与”在一起。对于更复杂的事情,您需要使用 LINQKit 和 Predicate Builder 之类的东西,或者使用您自己的等价物。
  • 有没有办法以菊花链方式连接 where 并使用 let/predicate 语句?我不认为 linq 工具包会在这里帮助我。我可以使用单独的谓词语句将我的方法以菊花链形式连接起来,但是当您选择时,数据会丢失,除非您将其绑定到视图模型。进入视图模型后,如何运行另一个 .where 并选择?
  • 我不确定您所说的“数据丢失”是什么意思。至于let,则将Select 转换为添加了let 范围变量定义的新匿名对象:from a in abc let b = a.name select b 转换为abc.Select(a =&gt; new { a, b = a.name }).Select(ab =&gt; ab.b) 之类的东西
  • 如果这是真的,我想这正是我所需要的。谢谢!!!

标签: c# linq iqueryable


【解决方案1】:

我还建议使用 lambda 表达式,您可以使用类似以下的内容:

bool requireMultipleInsurers = true;
List<Guid> insureres = new(){};
// to do add insurers


var _query = (from tbl in _dbContext.Shoes
              .Include(x => x.Insurer)
              select tbl);

if(insurers.Any())
{
    _query = _query.Where(x => x.Insurer.Any(y => insurers.Contains(y.Id)));
}

if(requireMultipleInsurers)
{
    _query = _query.Where(x => x.Insurer.Count() > 1);
}

var _results = await _query.ToListAsync();

这样,多个子句可以按照给定的一组条件串起来,并且只有在调用 ToListAsync() 时才会运行查询。

【讨论】:

  • 即使没有返回数据,添加包含是否会使查询连接? let 的好处是,如果您不在查询中使用谓词,它将排除我希望利用的 SQL 代码。我不确定这是否会做同样的事情,并且我担心可伸缩性,因为我在配置中包含越来越多的表
  • 如果您只需要过滤相关实体,而不仅仅是在 Where 子句中使用它们,它不会返回相关数据。如果您需要相关数据,请使用 Include 子句添加它。如果有时您需要包含相关数据,也可以有条件地添加 Include 子句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多