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 => new a, b = a.name ).Select(ab => 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 语句用视图模型分解成碎片的主要内容,如果未能解决你的问题,请参考以下文章