为 IQueryable 生成表达式 [重复]

2024-01-02

我正在使用 LINQ->WCF 数据服务->EF,它支持 LINQ 的子集,但有一些注意事项。一旦学习了各种事情的技巧和解决方法,我就没有遇到任何麻烦,但我想制作一个可重用的表达式生成器来仅比较Date的一部分DateTime.

对于常规 EF,您可以使用EntityFunctions.TruncateTime(EFDbFunctions.TruncateTime(EF6+),但这不适用于数据服务。

到目前为止,我的解决方案是重复构建这个混乱的 where 子句:

.Where(x => x.DateProperty.Year == DateToCompare.Year && 
            x.DateProperty.Month == DateToCompare.Month && 
            x.DateProperty.Day == DateToCompare.Day);

必须重复编写(但它有效)真是令人讨厌,所以我试图创建类似的东西:

.WhereDate(x => x.DateProperty, DateToCompare);

任何类似的东西都可以,只是简短、甜蜜和可读——我讨厌重复的、不必要的代码。

结构不是问题,我知道我需要一些东西IQueryable<T>, Func<T, DateTime> (or Expression<Func<T, DateTime>>), and DateTime并返回IQueryable<T>.

public static IQueryable<T> WhereDate<T>(this IQueryable<T> data, Func<T, DateTime>> selector, DateTime date)
{
    return data.Where(/*Something*/);
};

我遇到麻烦的地方是采用这个并构建一个可以放入该 where 子句中而不违反表达式树的限制的表达式。我不完全确定如何获取现有查询并将我自己的 where 语句添加到表达式中而不执行.Where,我认为这可能是这里的关键。我想我需要接受Expression<Func<T, DateTime>>并构建一些使用它来添加Expression<Func<T, bool>> to the tree and return it as anIQueryable`.

有人有这方面的经验吗,或者知道我应该阅读哪些文件?

这里最大的障碍是您无法将基于语句的 lambda 转换为表达式,并且无法将不支持的函数传递到数据服务中orEF。这使得所有简单的解决方案都变得不可能,据我所知,只剩下手动表达操作。


这是我在阅读了有关该主题的大量内容后提出的解决方案:

private static IQueryable<T> _whereDate<T>(this IQueryable<T> data, MemberExpression date1Expression, ParameterExpression parameter, DateTime date)
{
    var date1Year = Expression.Property(date1Expression, "Year");
    var date1Month = Expression.Property(date1Expression, "Month");
    var date1Day = Expression.Property(date1Expression, "Day");
    var date2Year = Expression.Constant(date.Year);
    var date2Month = Expression.Constant(date.Month);
    var date2Day = Expression.Constant(date.Day);
    var yearsEqual = Expression.Equal(date1Year, date2Year);
    var monthsEqual = Expression.Equal(date1Month, date2Month);
    var daysEqual = Expression.Equal(date1Day, date2Day);
    var allPartsEqual = Expression.AndAlso(Expression.AndAlso(daysEqual, monthsEqual), yearsEqual); //Day->Month->Year to efficiently remove as many as possible as soon as possible.
    var whereClause = Expression.Call(typeof(Queryable), "Where", new Type[] { data.ElementType }, data.Expression, Expression.Lambda(allPartsEqual, parameter));
    return data.Provider.CreateQuery<T>(whereClause);
}

public static IQueryable<T> WhereDate<T>(this IQueryable<T> data, Expression<Func<T, DateTime?>> selector, DateTime date)
{
    var selectorMemberExpression = ((MemberExpression)selector.Body);
    var nullableDateProperty = (PropertyInfo)selectorMemberExpression.Member;
    var entityExpression = Expression.Parameter(typeof(T));
    var date1Expression = Expression.Property(entityExpression, nullableDateProperty);
    return data._whereDate(Expression.PropertyOrField(date1Expression, "Value"), entityExpression, date);
}

public static IQueryable<T> WhereDate<T>(this IQueryable<T> data, Expression<Func<T, DateTime>> selector, DateTime date)
{
    var selectorMemberExpression = ((MemberExpression)selector.Body);
    var dateProperty = (PropertyInfo)selectorMemberExpression.Member;
    var entityExpression = Expression.Parameter(typeof(T));
    return data._whereDate(Expression.Property(entityExpression, dateProperty), entityExpression, date);
}

它被分成多个函数以减少冗余代码并支持两者DateTime and DateTime?.

我意识到没有检查可空版本是否缺乏价值 - 这是我很快就会添加的内容,但我想为其他人提供解决方案以供学习,并确保没有人浪费时间向我解释这一点。为了效率和可读性,我总是检查我的代码几次,记录功能,注释不清楚的事情,确保没有意外Exceptions 可能会出现,但这是先于它的。如果您逐字使用此代码,请记住这一点(如果您这样做,请告诉我,我想知道我没有浪费发布此代码的精力)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为 IQueryable 生成表达式 [重复] 的相关文章

  • .NET Windows 服务中调用 C# 的 wait 的 I/O 回调是否可以不阻塞?

    我知道在 ASP NET 中 当使用 wait 时工作线程会返回到池中 而 I O 发生在后台 这对于可扩展性非常有用 我的 Windows 服务是一个套接字服务器 它使用 Begin End 样式的异步套接字 I O 混合我的魔法 我知道
  • C/C++ 中随机数生成器的实现[重复]

    这个问题在这里已经有答案了 我对 C 中随机数生成器的实现有点困惑 它也与 C 中的明显不同 如果我理解正确 对 srand seed 的调用会以某种方式初始化可通过 rand 访问的隐藏变量 种子 该变量又将函数指向预先生成的序列 例如例
  • 可选参数“必须是编译时常量”

    我有一个类分为两个部分文件 如下所示 public partial class PersonRepository BaseRepository
  • WPF - 按多列排序时使用自定义比较器

    我有一个 ListView GridView 我想按 2 列排序 因此如果第 1 列中有 2 个以上的项目具有相同的值 它将按第 2 列排序 非常简单 但是在对 A Z 进行排序时 空字符串会出现在顶部 我想把它们移到底部 我制作了一个比较
  • 浏览器收集哪些值作为回发数据?

    当页面被发送回服务器时 浏览器收集每个控件的当前值并将其粘贴到一个字符串中 然后 该回发数据通过 HTTP POST 发送回服务器 Q1 除了控件的 Text 属性和 SelectedIndexchanged 因此除了用户输入数据 之外 控
  • 在 LINQ-SQL 中,将 DataContext 包装为一个 using 语句 - 优点 缺点

    有人可以从性能 内存使用 编码的简易性 正确的做法等因素方面阐述将 DataContext 包装在 using 语句中或不在 LINQ SQL 中之间的优缺点吗 Update 在一个特定的应用程序中 我发现 如果没有将 DataContex
  • C++:获取注册表值仅给出第一个字符[重复]

    这个问题在这里已经有答案了 我试图从注册表中获取字符串值 但我只得到第一个字母 HKEY hKey char gamePath MAX PATH if RegOpenKeyEx HKEY CURRENT USER L Software Bl
  • 隐形打开的弹出窗口

    第二天就解决这个问题 要重现 请创建新的 WPF 应用程序 xaml
  • C# ConfigurationManager 从 app.config 检索错误的连接字符串

    我有一个简单的 WinForms 应用程序 它最终将成为一个游戏 现在 我正在研究它的数据访问层 但遇到了障碍 我创建了一个单独的项目 名为DataAccess在其中 我创建了一个本地 mdfSQL Server 数据库文件 我还创建了一个
  • 在非指针变量和类成员上放置 new

    考虑以下示例 include
  • AspNetCore.SignalR:无法启动未处于初始状态的连接

    我无法让 ASP NET Core SignalR 应用程序正常运行 我有这个服务器端代码 public class PopcornHub Hub private int Users public async Task BroadcastN
  • 打破条件变量死锁

    我遇到这样的情况 线程 1 正在等待条件变量 A 该变量应该由线程 2 唤醒 现在线程 2 正在等待条件变量 B 该变量应该由线程 1 唤醒 在我使用的场景中条件变量 我无法避免这样的死锁情况 我检测到循环 死锁 并终止死锁参与者的线程之一
  • IEnumerable.比带中断的 for 循环更快吗?

    我们的代码打开表单时遇到了一些缓慢的情况 这可能是由于for循环与break这需要很长时间才能执行 我把它切换到IEnumerable Any 并看到表格很快打开 我现在试图弄清楚是否单独进行此更改会提高性能 或者是否正在访问Product
  • C# - 命名空间内的类型声明

    在命名空间内而不是在类中声明类型的可能用途是什么 For ex namespace Test public delegate void Ispossible 这是有效的并且不会产生任何编译错误 但我无法想象为什么我们会以这种方式声明它而不是
  • 停止 TcpListener 的正确方法

    我目前正在使用 TcpListener 来处理传入连接 每个连接都有一个线程用于处理通信 然后关闭该单个连接 代码如下 TcpListener listener new TcpListener IPAddress Any Port Syst
  • 为什么从绑定返回的对象会忽略额外的参数?

    假设我有一个带有两个参数的函数 void f int x int y 我想绑定其中之一 我可以用std bind如下 auto partiallyBoundF std bind f 10 1 partiallyBoundF仅需要一个参数 但
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • C 中的静态和动态绑定(严格来说是 C,而不是 C++)是什么?

    我最初对发布这个问题感到担忧 以免它重复 但即使在谷歌搜索了许多关键字之后 我在 StackOverflow 上找不到任何解释 C 的静态和动态绑定的链接 尽管有 C 的问题和答案 但是都涉及classes以及显然不适合 C 的东西 Sta
  • Crypto++ 和压缩 EC 密钥

    如何在 Crypto 中生成压缩的 ECDSA 密钥 AutoSeededRandomPool prng ECDSA
  • 编译器什么时候内联函数?

    在 C 中 函数仅在显式声明时才内联inline 或在头文件中定义 或者编译器是否允许内联函数 因为他们认为合适 The inline关键字实际上只是告诉链接器 或告诉编译器告诉链接器 同一函数的多个相同定义不是错误 如果您想在标头中定义函

随机推荐

  • git 远程名称中哪些字符是非法的?

    git 远程名称中哪些字符是非法的 我在 git 文档中没有找到它 我在文档中也没有找到任何内容 那么我们就来看看源码吧 当您尝试添加具有无效名称的遥控器或将遥控器重命名为无效名称时 您将收到一条错误消息 例如 致命 foo bar 不是有
  • 如何向 D3.js 图表添加固定范围垂直线

    我正在尝试在现有折线图上添加一条垂直线 我的数据如下所示 PC 列是计算出的百分比 图表上的垂直线应从 0 延伸到 100 var data Month 2014 06 PC 38 items 72 Month 2014 07 PC 33
  • 如何动态访问 strings.xml 中的值?

    我想做的是从中获取特定文本strings xml动态地 我认为这将涉及动态访问对象变量 将会有一个类似的函数 public void getDynamicString int level text setText R string leve
  • 如何解释 jag 中的某些语法(n.adapt、update..)?

    我对 jag 中的以下语法感到非常困惑 例如 n iter 100 000 thin 100 n adapt 100 update model 1000 progress bar none 目前我认为 n adapt 100意味着您将前 1
  • 如何链接到 /usr/local/lib 上的 libc++?

    我试图提供 L usr local lib tried nostdinc 尝试设置DYLD LIBRARY PATH and DYLD FALLBACK LIBRARY PATH but otool总是给我 otool L sample s
  • 作为服务运行时,TFS 构建代理无法连接到 TFS 2017 中的 HTTPS git

    我们在服务器上使用内部证书 我已按照以下步骤操作 https blogs msdn microsoft com tfssetup 2016 12 19 error ssl certificate problem unable to get
  • 如何在 CloudFormation 模板中创建一些随机或唯一值?

    有没有办法在 CloudFormation 模板中创建某种随机或唯一值 为什么我需要这个 在我们的模板中 我们有许多自定义命名的资源 例如AWS AutoScaling LaunchConfiguration与指定的LaunchConfig
  • P 值、显着性水平和假设

    我对 p 值的概念感到困惑 一般来说 如果 p 值大于 alpha 通常为 0 05 我们就无法拒绝原假设 如果 p 值小于 alpha 我们就拒绝原假设 据我了解 如果 p 值大于 alpha 则两组之间的差异只是来自采样误差或偶然 到目
  • 在 Go 中实现 Ruby 风格的笛卡尔积

    我想要得到的笛卡尔积a b c d a a1 b b1 b2 c c1 c2 c3 d d1 这是 Ruby 代码 e b c d print a product e 输出是 a1 b1 c1 d1 a1 b1 c2 d1 a1 b1 c3
  • 相当于 vb.net 中的 vb6.Format 函数,无需使用 Microsoft.Visualbasic.Compatibility.dll [重复]

    这个问题在这里已经有答案了 可能的重复 有没有办法以编程方式将 VB6 格式字符串转换为 NET 格式字符串 https stackoverflow com questions 4072490 is there a way to progr
  • Microsoft.NET.Sdk 和 Microsoft.NET.Sdk.Web 之间有什么区别

    我有一个包含两个主机项目的解决方案 一个是Web Host https learn microsoft com en us aspnet core fundamentals host web host view aspnetcore 2 1
  • 我的教义真的很慢。简单查询,一秒出结果

    这是我的设置 Windows Server 2008 R2mysql 5 1 562PHP 5 3 2教义1 2 任何人都知道为什么我的查询需要大约一秒钟才能执行一个简单的查询 echo date Y m d H i s time micr
  • 如何在 OpenSMILE 中创建自定义配置文件

    我正在尝试使用 OpenSMILE 从音频样本中提取一些功能 但我意识到设置配置文件是多么困难 该文档不是很有帮助 我能做的最好的事情就是运行一些提供的示例配置文件 查看结果 然后进入配置文件并尝试确定指定功能的位置 这是我所做的 我使用了
  • AngularJS Linky 过滤器停止传播

    我有一个span标签看起来像这样 span span 在 ng repeat 内 但我有一个问题 如果item Name包含电子邮件或链接链接过滤器会更改 html 并插入锚标记 现在 当我单击链接时 ng click 会触发并且锚点打开
  • 如何在mvc5中将文化设置为全局

    我正在使用资源文件来切换在 mvc5 中构建的 Web 应用程序中的语言 在索引文件中 它读取我设置的文化值 我从layout cshtml 调用设置区域性方法 并使用以下代码调用其值 Layout Views Shared Layout
  • 将网格高度调整为可用屏幕,无需滚动条

    我应该使用什么网格属性来使网格完美地保持在屏幕内 Using height 100vh on wrapper调整高度 但引入了滚动条 为了删除不需要的滚动条 我尝试设置body margin 0 但我希望在整个网格周围有一个边距 而不产生滚
  • 响应对象 - 使用 Mollie 和 Omnipay 付款

    我正在尝试在 Laravel 项目中使用 Omnipay 和 Mollie 创建付款方式 我正在使用以下 2 个库 https github com barryvdh laravel omnipay https github com bar
  • Python:计算一组整数中所有元素之间的差异[重复]

    这个问题在这里已经有答案了 我想计算一组整数中所有元素之间的绝对差 我正在尝试做abs x y where x and y是集合中的两个元素 我想对所有组合执行此操作 并将结果列表保存在一个新集合中 我想计算一组整数中所有元素之间的绝对差
  • 参考错误:Jest 环境被拆除后“导入”文件

    我是测试反应本机应用程序的新手 我从 Jest 开始 运行名为 App test js 的测试 该测试通过了 但我收到参考错误 You are试图importJest 环境被拆除后的文件 我努力了 jest useFakeTimers an
  • 为 IQueryable 生成表达式 [重复]

    这个问题在这里已经有答案了 我正在使用 LINQ gt WCF 数据服务 gt EF 它支持 LINQ 的子集 但有一些注意事项 一旦学习了各种事情的技巧和解决方法 我就没有遇到任何麻烦 但我想制作一个可重用的表达式生成器来仅比较Date的