【问题标题】:How to make linq expression with multiple parameters如何使用多个参数制作 linq 表达式
【发布时间】:2018-03-21 22:24:46
【问题描述】:

我正在尝试编写一个可重用的 linq 表达式,并将多个参数传递到:

private System.Linq.Expressions.Expression<Func<FeeDetail, FeeDetail, bool>> IsPrevFeeDetail
   {
       get
       {
           return (feeLevelDetail, currentFeeLevelDetail) =>
           feeLevelDetail.ToDt < currentFeeLevelDetail.FromDt);
       }
   }

但我见过的每个表达式示例都只使用一个参数(您要查询的实体类型)。

有什么方法可以开箱即用吗?

【问题讨论】:

  • 这里的主要问题是 where 采用Func&lt;T, bool&gt;(或Expression&lt;Func&lt;T,bool&gt;&gt;) - 它单独作用于每一行,而不是成对的行; lambda 部分应该没问题,但是:您打算在哪里使用 Func&lt;T,T,bool&gt;?据我所知,LINQ-to-SQL 没有用 Func&lt;T,T,bool&gt;
  • 我正要问这个问题。我也很好奇如何做到这一点。我的示例使用Func&lt;T, int, bool&gt;。我的 where 子句更简单,如果列值为 1 或类似的值,我将检查 where 子句。
  • @MarcGravell 是的,我想将它与 LINQ-to-SQL 一起使用,这就是困难......

标签: c# linq lambda linq-to-sql


【解决方案1】:

您在我回答时的问题只是询问是否可以使用多个参数的表达式。它们可以使用,而且是。

.Join.GroupJoin 都有一个表达式参数,作为最后一个参数,该参数接受从连接的每一侧派生的类型并返回单个实体并返回单个类型。

tableA.Join(tableB, e => e.Id, e => e.TableAId, (a, b) => new {
    IsPrevFee = a.ToDt < b.FromDt,
    AEntry = a,
    BEntry = b
}).Where(e => e.IsPrevFee);

但是,从您问题中的示例来看,您似乎想在Where 中使用它。这不起作用,因为任何 Linq 查询函数都会返回单一类型的集合。您已经在上面看到了,我基本上将 2 个实体的连接转换为单一类型的输出。我使用了匿名类型,但请注意,这也可以是具体类型,然后您可以将其放入可重用的连接表达式中,然后您就可以得到一个可以传递给的单输入表达式Where 子句。

为 cmets 编辑:

您应该能够通过关闭另一个参数来创建Expression&lt;Func&lt;MyEntity, bool&gt;&gt;。我正在即时执行此操作,因此请忽略任何琐碎的语法错误,但示例如下:

Expression<Func<MyEntity, bool>> GetMyWhereClause(int statusId)
{
    return myEntity => myEntity.StatusId == statusId;
}

用法:

var MyWhereClause = GetMyWhereClause(5);
var result = db.MyEntities.Where(MyWhereClause);

我不确定,但我不相信这适用于非基元,因为 LINQ-to-SQL 可能无法解析生成的表达式。

【讨论】:

  • 我认为 OP 和我在问类似的问题,我有一个 Func&lt;Entity, int, bool&gt; func = (x, y) =&gt; x.Property == y;。这对我来说也应该是T-SQL 中的一个非常简单的 where 子句,它的计算结果类似于where table.Property = 5。我该怎么做呢?
  • 确实有效!问题是 linq to sql 无法获取值 5 并且不会生成该 sql。我将对创建表达式树进行一些研究。谢谢。
  • @christopherclark 你的研究有什么收获吗?
  • @AntonToshik 我得出的结论是这很麻烦。但看起来表达式树确实可以工作。我只是不想构建每个表达式树。对我来说真正奇怪的是为什么甚至需要构建一个表达式树。 x.Property == y 是每个人在他们的 linq-to-sql 中所做的正常事情。那么为什么如果我把它拿出来表达它会吓坏呢?我没有考虑的另一个选项只是尝试扩展 iqueryable,或创建一个实现 iqueryable 的不同对象,该对象将添加横切业务详细信息查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多