使用带有linq查询的表达式

时间:2017-09-25 14:21:39

标签: c# linq

目前我有一个linq查询,其中包含一个驻留在其中的方法。我收到错误LINQ to Entities does not recognize the method。所以我发现我可以将方法转换为表达式LINQ to Entities does not recognize the method,但我想知道是否有一种干净简单的方法将表达式添加到我的linq查询中。

原创方法

public bool IsAvailable()
{
    return Eligibility.ProgramType == InteractionProgramTypes.Available;
}

已更改为

public System.Linq.Expressions.Expression<Func<InteractionProgram, bool>> IsAvailable()
{
    return i => i.Eligibility.ProgramType == InteractionProgramTypes.Available;
}

没有表达的Linq查询

x => x.ActivityDate <= endDate && x.IsAvailable()

带表达式的Linq查询

x => x.ActivityDate <= endDate && x.IsAvailable().Compile()

当我这样做时,我得到编译器错误,&amp;&amp;运算符不能应用于操作数。

请问如何将表达式附加到我当前的linq查询中。

1 个答案:

答案 0 :(得分:0)

由于您已将class NTWaterfallViewCell :UICollectionViewCell, NTTansitionWaterfallGridViewProtocol{ var photoName = "" var imageName : String? var imageViewContent : UIImageView = UIImageView() var label:UILabel = UILabel() required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override init(frame: CGRect) { super.init(frame: frame) backgroundColor = UIColor.lightGray contentView.addSubview(imageViewContent) contentView.addSubview(label) } override func layoutSubviews() { super.layoutSubviews() imageViewContent.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height) imageViewContent.loadImageWithURL(imageName!) label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21)) label.center = CGPoint(x: 160, y: 285) label.textAlignment = .center label.text = photoName } 转换为返回IsAvailable,因此您需要做的就是将调用此方法的结果传递给Expression<Func<InteractionProgram,bool>>的{​​{1}}方法:< / p>

Where

请注意,为了编译它,您的IQueryable<T>方法需要是静态的。此外,您可以将其作为更好的可读性的属性:

var res = ctx.InteractionPrograms.Where(InteractionProgram.IsAvailable());
  

另一个条件是什么x.ActivityDate&lt; = endDate。那会怎样?

其他条件会在IsAvailable条件之前或之后立即进入单独的class InteractionProgram { public static Expression<Func<InteractionProgram,bool>> IsAvailable {get;} = i => i.Eligibility.ProgramType == InteractionProgramTypes.Available; ... // other members of the class } ... var res = ctx.InteractionPrograms.Where(InteractionProgram.IsAvailable); 子句。 EF驱动程序将为您组合两个表达式,从而在RDBMS端生成单个查询。

共享此表达式的另一种方法是在EF上下文中创建一个扩展方法,该方法返回Where预过滤的可用性:

IsAvailable

这隐藏了共享方法背后的功能。