我想就此提出一些专家建议。我之前使用过编译查询,但对于这种特殊情况,我不确定它是否合适。
这是一个搜索表单,其中查询更改并依赖于正在搜索的内容。
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 。不确定这是否有所不同。
由于
答案 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;
}
我希望你能说出我的话。