Linq:如何对关联对象使用规范
我正在以这种形式使用规范:
public static Expression<Func<User, bool>> IsSuperhero
{
get
{
return x => x.CanFly && x.CanShootLasersFromEyes;
}
}
现在我可以以以下形式使用此规范:
var superHeroes = workspace.GetDataSource<User>().Where(UserSpecifications.IsSuperhero);
但我不确定如何针对这样的关联对象使用该规范:
var loginsBySuperheroes = workspace.GetDataSource<Login>().Where(x => x.User [ ??? ]);
有没有办法做到这一点,或者我可以这样做吗?需要重新考虑我的规范实施吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
本质上,您需要创建一个
Expression>
来从登录中收集关联的用户,然后对该用户应用现有的IsSuperhero
谓词。实现此目的的规范方法是在“包含”表达式(本例中为IsSuperHero
)上使用Expression.Invoke
,将其参数替换为适当的参数。不幸的是,这种方法手工执行起来相当混乱。更糟糕的是,许多 LINQ 提供程序(例如 LINQ to Entities)根本不喜欢这种“表达式内的表达式”方法。解决这个问题的方法是将“调用的”表达式“内联”到更大的表达式中,以便它看起来像一个单个,巨大的表达式树。
幸运的是,有一个方便的库 LINQKit 可以帮助解决这个问题:
Essentially, you need to create an
Expression<Func<Login, bool>>
that collects the associated User from a Login and then applies the existingIsSuperhero
predicate on that user. The canonical way to accomplish this is to useExpression.Invoke
on the 'contained' expression (IsSuperHero
in this case), replacing its parameters with appropriate arguments.Unfortunately, this approach is quite messy to do by hand. Worse, many LINQ providers, such as LINQ to Entities, don't like this sort of 'expression inside an expression' approach at all. The way around this is to 'inline' the 'invoked' expression into the bigger expression so that it all looks like a single, giant, expression-tree.
Fortuantely, there's the handy library LINQKit that can help out with this:
显然:
这可能很有趣:
Obviously:
This can be fun:
您可以创建自己的自定义 QueryProvider,详细说明如下:http://msdn。 microsoft.com/en-us/library/bb546158.aspx
You can create your own custom QueryProvider as explained in detail here: http://msdn.microsoft.com/en-us/library/bb546158.aspx
我相信您需要编译然后调用表达式:
另一种方法可能是预编译表达式:
I believe you need to compile and then invoke the expression:
An alternative might be to pre-compile the expression: