C# 我可以引用已编译查询作为已编译查询的数据源吗?
最好用代码来描述这一点 我有这个C# 我可以引用已编译查询作为已编译查询的数据源吗?,c#,.net,linq,C#,.net,Linq,最好用代码来描述这一点 我有这个 public class A<T> { public static class Queries { public static Func<DataContext, int, T>Get = CompiledQuery.Compile<DataContext, int, T>( (DataContextdb, int
public class A<T>
{
public static class Queries
{
public static Func<DataContext, int, T>Get =
CompiledQuery.Compile<DataContext, int, T>(
(DataContextdb, int i) => (from t in db.GetTable<T>()
where t.ID == i
select t).SingleOrDefault());
}
}
公共A类
{
公共静态类查询
{
公共静态函数=
CompiledQuery.Compile(
(DataContextdb,inti)=>(从db.GetTable()中的t开始)
其中t.ID==i
选择t.SingleOrDefault());
}
}
我可以创建一个新的类和查询吗
public class B<T>:A<t>
{
public static class BQueries
{
public static Func<DataContext, int, T> Get =
CompiledQuery.Compile<DataContext, int, T>(
(DataContext db, int id) => (from t in A.Queries.Get(db, id)
where !t.Item.Deleted
select t).SingleOrDefault());
}
public abstract TrackingItem Item;
}
公共B类:A
{
公共静态类查询
{
公共静态Func-Get=
CompiledQuery.Compile(
(DataContext db,int id)=>(从A.querys.Get(db,id)中的t开始)
其中!t.Item.Deleted
选择t.SingleOrDefault());
}
公共摘要跟踪项;
}
我所要做的就是在原始查询的基础上编译一个新的查询,添加一些约束。这代替了执行两个查询如果
A.querys.Get(…)
返回一个IQueryable
,但在编写代码时,您的代码返回一个T
。但是,如果删除SingleOrDefault()
,它应该可以正常工作
更新:为了更好地度量,此代码应该可以工作:
public static class Queries
{
public static Func<DataContext, int, IQueryable<T>>Get =
CompiledQuery.Compile<DataContext, int, IQueryable<T>>(
(DataContext db, int i) => from t in db.GetTable<T>()
where t.ID == i
select t);
}
public static class BQueries
{
public static Func<DataContext, int, IQueryable<T>> Get =
CompiledQuery.Compile<DataContext, int, IQueryable<T>>(
(DataContext db, int id) => from t in A.Queries.Get(db, id)
where !t.Item.Deleted
select t);
}
啊,我现在明白了。。。这是有道理的。我是为了推迟执行而开枪的。将SingleOrDefault编译成一个查询有意义吗?它总是在可用性和解析表达式的性能成本之间进行权衡。我倾向于尽可能地延迟,但这取决于您的用例。将执行延迟到最后一个可能的时刻是我的目标。将SingleOrDefault添加到已编译查询是否会导致它在引用查询时立即执行?是的,将任何立即运算符添加到已编译查询的末尾意味着您将拥有一个委托,该委托在使用DataContext调用时立即执行。
using(var db = new MyDataContext())
{
var res = BQueries.Get(db, id);
var entity = res.SingleOrDefault();
// ...
}