LINQ:何时使用编译查询?

时间:2011-09-22 03:24:48

标签: 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
                }));

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

var query = Search(context, 123);
query = query.Where(w => w.Name.Contains(searchString));

所以我的问题是,它是在LocationID == 123返回所有结果,然后检查searchString匹配的结果吗?或者它实际上是在扩展已编译的查询?

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

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

注意:我在 ASP.NET 网站上使用上面的 Linq to SQL 。不确定这是否有所不同。

由于

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

据我所知,编译一次查询是一个好习惯,这就是预编译查询的全部要点(这也就是你的预编译查询是静态的),它节省了编译查询的时间。 SQL。如果它扩展了预编译的查询,那么它再次编译该查询,你就会失去收益。

结果查询结果(您的查询变量)不再是LINQ to SQL。

答案 2 :(得分:0)

只需在编译的查询中包含附加条件即可。

DB.Person.Where(w => w.LocationID == ID 
                     & (searchString=="" || w.Name.Contains(searchString)))

答案 3 :(得分:0)

如果我是对的,那么你需要在linq中使用一些动态where子句。因此,我建议采用这种方式

IEnumerable list;

if(condition1)
{
  list = Linq Statement;
}

if(condition2)
{
  list = from f in list where con1=con && con2=con select f;
}

if(condition3)
{
 list = from n in list  con1=con && con2=con select f;
}

我希望你能说出我的话。