gpt4 book ai didi

c# - 是否可以手动修改 IQueryable 表达式

转载 作者:太空狗 更新时间:2023-10-29 23:33:39 27 4
gpt4 key购买 nike

我很确定我知道答案是否定的,但作为最后的尝试,我想我会在这里问这个问题。

我首先使用 EF 代码以通常的方式查询表

_context.Set<Foo>().Where(f => f.Bar == 999);

它创建了以下表达式(我刚刚写了这个所以它可能是错误的)。

{SELECT 
[Extent1].[Test] AS [Test],
[Extent1].[Test2] AS [Test2],
FROM [dbo].[Foo] AS [Extent1]
WHERE 19 = [Extent1].[Bar]}

现在,是否可以手动修改此查询以将表名更改为例如 Foo10? (可能不是)

如果做不到这一点,有人知道我可以先在代码中“后期绑定(bind)”表名的方法吗?

您可能想知道“为什么要进行肮脏的黑客攻击?”与往常一样,这是数据库的遗留问题,存在一些设计问题且无法更改。

提前致谢。

附言。我知道我可以使用 Database.SqlQuery 但我宁愿不用。

最佳答案

你为什么不使用TPT继承你的模型?

类似于@Krizz 的回答,但您避免使用动态 LINQ。

使用您的评论:

if a particular parameter has a value of 1 look in Foo1 if its 2 look in Foo2 and so on

所以,你可以这样做:

var query = ctx
.Foos
.OfMyType(value)
.Where(f => f.Bar == 999) // f.Bar is on the base/abstract entity.
.ToList();

在哪里OfMyTypeIQueryable<T> 上的自定义扩展方法:

public static IQueryable<T> OfMyType<T>(this IQueryable<T> source, string value)
{
switch (value)
{
case "1":
return source.OfType<Foo1>();
case "2":
return source.OfType<Foo2>();
// etc, etc
}
}

大多数(如果不是全部)属性将在抽象的“Foo”实体上,您为每个表创建派生实体,每个表都有自己的支持表。

这样,“消费”代码(例如进行查询的代码)不需要关心不同的表/Foo,它们只需将“神奇值”传递给您的存储库(希望您正在使用),然后您就可以默默地切换到你想要的 table 。

那行得通吗?

关于c# - 是否可以手动修改 IQueryable 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9049618/

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