首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linq:如何对关联的对象使用规范

Linq:如何对关联的对象使用规范
EN

Stack Overflow用户
提问于 2011-11-08 19:48:51
回答 4查看 668关注 0票数 5

我使用这种形式的规范:

代码语言:javascript
运行
复制
public static Expression<Func<User, bool>> IsSuperhero
{
  get
  {
    return x => x.CanFly && x.CanShootLasersFromEyes;
  }
}

现在我可以在下面的形式中使用这个规范:

代码语言:javascript
运行
复制
var superHeroes = workspace.GetDataSource<User>().Where(UserSpecifications.IsSuperhero);

但是我不确定如何对这样的关联对象使用该规范:

代码语言:javascript
运行
复制
var loginsBySuperheroes = workspace.GetDataSource<Login>().Where(x => x.User [ ??? ]);

有没有办法做到这一点,或者我需要重新考虑我的规范实现?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-08 23:29:39

显然:

代码语言:javascript
运行
复制
var loginsBySuperheroes = workspace.GetDataSource<User>()
  .Where(UserSpecifications.IsSuperhero)
  .SelectMany(x => x.Logins);

这可能很有趣:

代码语言:javascript
运行
复制
var secretBillionaires = workspace.GetDataSource<User>()
   .Where(UserSpecifications.IsSuperhero)
   .SelectMany(user => user.Logins)
   .Where(LoginSpecifications.IsSecretIdentity)
   .Select(login => login.DayJob)
   .Where(DayJobSpecifications.IsBillionaire)
票数 2
EN

Stack Overflow用户

发布于 2011-11-08 20:50:05

本质上,您需要创建一个从登录中收集相关用户的Expression<Func<Login, bool>>,然后将现有的IsSuperhero谓词应用于该用户。完成此任务的规范方法是对“包含”表达式(在本例中为IsSuperHero)使用Expression.Invoke,将其参数替换为适当的参数。

不幸的是,这种方法手工做起来相当混乱。更糟糕的是,许多LINQ提供程序,如LINQ to Entities,根本不喜欢这种“表达式中的表达式”方法。解决这个问题的方法是将“调用的”表达式“内联”到更大的表达式中,这样看起来就像一个巨大的表达式树。

幸运的是,有一个方便的库LINQKit可以帮助解决这个问题:

代码语言:javascript
运行
复制
#region LINQKit Magic

Expression<Func<Login, bool>> predicate = login => IsSuperHero.Invoke(login.User);
var expandedPredicate = predicate.Expand(); 

#endregion LINQKit Magic

var loginsBySuperheroes = workspace.GetDataSource<Login>().Where(expandedPredicate);
票数 4
EN

Stack Overflow用户

发布于 2011-11-08 19:54:01

您可以创建您自己的自定义QueryProvider,详细说明如下:http://msdn.microsoft.com/en-us/library/bb546158.aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8049901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档