gpt4 book ai didi

c# - 在 LINQ-To-SQL 中使用返回表达式的方法

转载 作者:行者123 更新时间:2023-11-30 17:57:59 25 4
gpt4 key购买 nike

我正在尝试向从 SQL 表创建的 linq 对象添加一个计算列。我无法在数据库中执行此操作。

public partial class History_SHIP
{
public Expression<Func<DateTime>> TransactionDateTime
{
get
{
return () => TransactionDate.AddMinutes(SqlMethods.DateDiffMinute(TransactionTime, new DateTime(1900, 1, 1)));
}
}
}

我希望能够将它用作 where 子句的一部分,如下所示:

where sh.TransactionDateTime >= startDate

startDateDateTimesh是我的 History_SHIP对象。

我也希望能够在 select 语句中轻松使用它(我很高兴创建另一个执行 TranslationDateTime.Compile()() 的属性)。

where 子句的问题是 Expression<Func<DateTime>> 中的 LHS RHS 是 DateTime , 所以它提示。


我看过这个链接http://www.codeproject.com/Articles/32968/QueryMap-Custom-translation-of-LINQ-expressions但不希望对这个属性有额外的依赖(无论如何现在)。

最佳答案

是的,由于各种原因,那不会很开心;

  • 首先,LINQ 解释器可以直接处理 - 它需要帮助
  • 其次,实现的属性返回一些与this相关的东西,但实际上我们需要一些与ParameterExpression(又名sh)相关的东西>)

最简单的事情可能是添加一个扩展方法,让您可以方便地对此进行过滤,例如通过重写 Expression:

var filtered = source.WhereTransactionDate(when => when > DateTime.Now);

实现:

static class Utils
{
static readonly Expression<Func<Foo, DateTime>> tranDateTime =
x => x.TransactionDate.AddMinutes(SqlMethods.DateDiffMinute(
x.TransactionTime, new DateTime(1900, 1, 1)));

public static IQueryable<Foo> WhereTransactionDate(
this IQueryable<Foo> source,
Expression<Func<DateTime, bool>> predicate)
{
var visited = SwapVisitor.Swap(predicate.Body,
predicate.Parameters.Single(), tranDateTime.Body);
var lambda = Expression.Lambda<Func<Foo, bool>>(
visited, tranDateTime.Parameters);
return source.Where(lambda);
}

class SwapVisitor : ExpressionVisitor
{
public static Expression Swap(Expression source,
Expression from, Expression to)
{
return new SwapVisitor(from, to).Visit(source);
}
private SwapVisitor(Expression from, Expression to)
{
this.from = from;
this.to = to;
}
readonly Expression from, to;
public override Expression Visit(Expression node)
{
return node == from ? to : base.Visit(node);
}
}
}

这样做是合并两个表达式树,即

x => x.TransactionDate.AddMinutes(SqlMethods.DateDiffMinute(
x.TransactionTime, new DateTime(1900, 1, 1)))

和:

when => when > DateTime.Now

将所有 when 替换为第一个表达式的主体(并使用第一个表达式的参数)即创建

x => x.TransactionDate.AddMinutes(SqlMethods.DateDiffMinute(
x.TransactionTime, new DateTime(1900, 1, 1))) > DateTime.Now;

关于c# - 在 LINQ-To-SQL 中使用返回表达式的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12815121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com