gpt4 book ai didi

c# - 在编译查询中包含 "offline"代码

转载 作者:太空狗 更新时间:2023-10-29 21:51:59 26 4
gpt4 key购买 nike

当我在已编译的查询中包含一个函数时,幕后会发生什么,就像我在这里使用 DataConvert.ToThema() 将表对象转换为我的自定义业务对象一样:

public static class Queries
{
public static Func<MyDataContext, string, Thema> GetThemaByTitle
{
get
{
var func = CompiledQuery.Compile(
(MyDataContext db, string title) =>
(from th in elan.tbl_Thema
where th.Titel == title
select DataConvert.ToThema(th)).Single()
);
return func;
}
}
}

public static class DataConvert
{
public static Thema ToThema(tbl_Thema tblThema)
{
Thema thema = new Thema();

thema.ID = tblThema.ThemaID;
thema.Titel = tblThema.Titel;
// and some other stuff

return thema;
}
}

然后这样调用它

Thema th = Queries.GetThemaByTitle.Invoke(db, "someTitle");

显然该函数没有被翻译成 SQL 或其他东西(怎么可能),但是当我在 VS2010 中设置断点时它也不成立。

它工作没有问题,但我不明白如何或为什么。那里到底发生了什么?

最佳答案

您的 DataConvert.ToThema() 静态方法只是创建一个具有默认构造函数的类型的实例,并设置各种属性,对吗?如果是这样,它与以下内容并没有太大区别:

(from th in elan.tbl_Thema
where th.Titel == title
select new Thema{ID=th.ThemaID, Titel=th.Titel, etc...}
).Single());

当您调用 Queries.GetThemaByTitle 时,将编译一个查询。 (顺便说一句,您调用它的方式实际上可能会或可能不会给您预编译带来任何好处)。那个'Query'实际上是一个代码表达式树,其中只有一部分用于生成发送到数据库的SQL代码。

它的其他部分将生成 IL 代码,这些代码正在获取从数据库返回的内容并将其放入某种形式以供您使用。 LINQ(EF 或 L2S)足够聪明,能够接受您的静态方法调用并从中生成 IL 来执行您想要的操作 - 也许它是通过内部 delegate 或类似的方式来实现的。但最终,它不需要与我上面替换的生成的内容有(太多)不同。

但是请注意,无论您返回的是什么类型,都会发生这种情况;在某处,正在生成将 DB 值放入 CLR 对象的 IL 代码。那是那些表达式树的另一部分。


如果您想更详细地了解这些表达式树及其涉及的内容,我必须为您挖掘,但根据您的问题我不确定这是否是您要查找的内容。

关于c# - 在编译查询中包含 "offline"代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5582559/

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