gpt4 book ai didi

c# - 自动将一些 Where 子句添加到 Linq 表达式树

转载 作者:行者123 更新时间:2023-11-30 16:37:01 28 4
gpt4 key购买 nike

我正在使用 Entity Framework 和 Linq to Entities。我创建了一个小型数据库模式和框架来实现版本控制和本地化。现在每个实体都包含两个或三个表(即 Product、ProductBase 和 ProductLocal)。

我的 linq 总是包含以下样板代码:

from o in DB.Product
from b in o.Base
from l in o.Local
WHERE o.VersionStatus == (int)VersionStatus.Active
&& b.VersionStatus == (int)VersionStatus.Active
&& l.VersionStatus == (int)VersionStatus.Active
&& l.VersionLanguage == Context.CurrentLanguage
select new ProductInstance { Instance = o, Base = b, Local = l }

我想完成的是把上面的变成:

(from o in DB.Product
from b in o.Base
from l in o.Local
select new ProductInstance { Instance = o, Base = b, Local = l }).IsActive()

或者最坏的情况是:

from o in DB.Product.Active()
from b in o.Base.Active()
from l in o.Local.Active()
select new ProductInstance { Instance = o, Base = b, Local = l }

我扩展了 EDM 生成的基类,以实现一些强制执行属性(IVersionStatus 和/或 IVersionLanguage)的接口(interface)。有什么方法可以遍历表达式树,检查表达式中的类型是否实现了该接口(interface),然后相应地设置 VersionStatus?

我希望它像第一个选项一样简单,只是少写和/或忘记。我已经看到了事后执行它的例子,在它的 IEnumerable 之后,但我宁愿不要从数据库中提取比我需要的更多的东西。

感谢任何提示!

最佳答案

是的。

您可以通过在 IQueryable 上定义一个名为 IsActive 的扩展方法来做到这一点。IQueryable 上有一个名为“Expression”的属性,它返回一个表达式树,表示从您的查询生成的 LINQ 方法调用链。

在你的情况下,它看起来像这样:

DB.Product.SelectMany(o=>o.base, (o, b)=>new{o.b}).SelectMany(item=>o.local, (item, local)=>new {item.o, item.b, item.local}).Select(item=>new ProductInstance { Instance = item.o, Base = item.b, Local=item.Local});

“DB.Product”是第一个 From 子句中的项目。每个剩余的“SelectMany”调用都是一个附加的 from 子句。

然后您可以深入研究表达式树以收集所有 from 子句元素。查看它们的类型,然后最终为 where 子句生成表达式树。

然后您的扩展方法将返回 .Where off IQueryable 参数使用您生成的 where 子句。

当您尝试“foreach”结果时,生成的 Where 子句将与其余查询一起在服务器上执行。

编辑:

请注意,如果您希望它与显式“Join”子句一起使用,那么除了“SelectMany”之外,您还需要添加对“Join”方法的支持。

关于c# - 自动将一些 Where 子句添加到 Linq 表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/217219/

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