LINQ:何时使用编译查询?

jzm*_*jzm 10 c# linq linq-to-sql compiled-query

我想就此提出一些专家建议.我之前使用过编译查询,但对于这种特殊情况,我不确定它是否合适.

它是一个搜索表单,其中查询更改并依赖于正在搜索的内容.

static Func<DBContext, int, IQueryable<Foo>> Search = CompiledQuery.Compile(
    (DBContext db, int ID) =>
        db.Person
            .Where(w => w.LocationID = ID)
            .Select(s => 
                new Foo 
                { 
                    Name = s.PersonName, 
                    Age = s.Age,
                    Location = s.LocationName,
                    Kin = s.Kin
                }));
Run Code Online (Sandbox Code Playgroud)

现在如果有人填写搜索框,我想通过向查询添加另一个Where语句来扩展查询:

var query = Search(context, 123);
query = query.Where(w => w.Name.Contains(searchString));
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,它将所有结果返回到哪里LocationID == 123,然后检查searchString匹配的结果?或者它实际上是否扩展了编译的查询?

如果它是前者(我怀疑它是),应该废弃CompiledQuery并只创建一个扩展查询的方法然后将其作为列表返回?

此外,最佳CompiledQuery使用方法是什么,是否有使用时间的指导原则?

注意:我在使用Linq to SQLASP.NET网站中使用上述内容.不确定这是否有所不同.

谢谢

PCa*_*nde 3

问题是编译后的查询是一成不变的;它知道将对数据库运行什么 SQL。然而,lambda 表达式是延迟加载的,并且无法修改编译查询,因为它是在运行时运行的。坏消息是,它将返回数据库中的所有记录,但它将查询内存中的这些记录以进一步细化它们。

如果您想编译查询,那么我建议编写两个具有不同签名的查询。