10

我想要一些专家的建议。我以前使用过编译查询,但对于这种特殊情况,我不确定它是否合适。

这是一种搜索表单,其中查询会发生变化,并且取决于正在搜索的内容。

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));

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

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

此外,使用的最佳实践是什么CompiledQuery,是否有什么时候应该使用它们的指南?

注意:我在带有Linq to SQL的ASP.NET网站中使用上述内容。不确定这是否有任何区别。

谢谢

4

4 回答 4

3

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

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

于 2011-09-22T19:21:39.797 回答
0

据我所知,最好编译一次查询,这就是预编译查询的全部意义(这就是预编译查询是静态的原因),这样可以节省将查询编译成 SQL 的时间。如果它扩展了那个预编译的查询,那么它会再次编译那个查询,你会失去收益。

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

于 2011-09-22T03:40:00.380 回答
0

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

DB.Person.Where(w => w.LocationID == ID 
                     & (searchString=="" || w.Name.Contains(searchString)))
于 2011-09-22T05:21:39.430 回答
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;
}

我希望你能听懂我的话。

于 2011-09-22T17:42:41.803 回答