【发布时间】: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)之类的东西 -
如果这是真的,我想这正是我所需要的。谢谢!!!
标签: c# linq iqueryable