c# linq let 语句用视图模型分解成碎片

Posted

技术标签:

【中文标题】c# linq let 语句用视图模型分解成碎片【英文标题】:c# linq let statement broken into pieces with a view model 【发布时间】: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) 之类的东西 如果这是真的,我想这正是我所需要的。谢谢!!! 【参考方案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 子句。

以上是关于c# linq let 语句用视图模型分解成碎片的主要内容,如果未能解决你的问题,请参考以下文章

如何并行运行 LINQ 'let' 语句?

C# linq 多表in语句查询

C# LINQ 详解 From Where Select Group Into OrderBy Let Join

C#的string转换成int问题

C#图解教程 第十九章 LINQ

使用 C# 中的 NEST 库调用 elasticsearch 时,如何向 linq 语句添加条件逻辑?