目前我有一个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查询中。
答案 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
这隐藏了共享方法背后的功能。