【问题标题】:Create Linq Expression ( Combine Expressions )创建 Linq 表达式(组合表达式)
【发布时间】:2015-11-17 12:10:34
【问题描述】:

我正在使用实体框架 6.1.3 和 .net 框架 4.5.1 和 C# 语言。

我想做的是;我想将表达式与 if-else 语句结合起来。
这是我的表情

Expression<Func<Article, bool>> expression = 
    q => (!newsDayStart.HasValue || q.PublishedOn >= newsDayStart) &&
         (!newsDayEnd.HasValue || q.PublishedOn <= newsDayEnd) &&
         (!categoryId.HasValue || q.CategoryId == categoryId.Value) &&
         (string.IsNullOrEmpty(searchText) || q.Title.Contains(searchText) &&
         (!isActive != null || q.IsActive == isActive.Value));

Expression<Func<Article, bool>> expression = ......;

if ( newsDayStart.HasValue )
{
   //Obviosly += this statement will not work.
   expression += q => q.PublishedOn > = newsDayStart

}

//TODO write other if else statements...

//Send expression
_context.Articles.Where(expression).Count();

【问题讨论】:

标签: c# entity-framework linq


【解决方案1】:

如果这专门用于 EF 查询,那么您可能会发现链接 Where() 调用以实现相同的效果更容易。

Expression<Func<Article, bool>> expression = ......;

//Send expression
var query = _context.Articles.Where(expression)

if ( newsDayStart.HasValue )
{
    query = query.Where(q => q.PublishedOn > = newsDayStart);
}

query.Count();

*编辑

您可以尝试使用这个第三方库 PredicateBuilder http://www.albahari.com/nutshell/predicatebuilder.aspx

【讨论】:

  • 感谢您的回答。但对不起,我不能为我们的抽象做那个。我们在服务层生成过滤器业务代码并将其传递给数据层。这就是为什么我们需要构建一个表达式并将其作为方法的参数发送。
  • @Lost_In_Library 然后只需重构您的层,使其接受查询并返回查询,而不是提供表达式。这样就容易多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
相关资源
最近更新 更多