2011-11-08 138 views
0

我遇到了Linq查询的问题,它实际上会做我需要的。我构建了一个需要在数据库中查找文章的搜索(实体框架),搜索然后使用复选框列表来允许用户只在某些练习领域内进行搜索。我已经看到关于linq加入&多个集合的帖子,但我的问题是,我想从中选择的是父表项文章,我需要从实践清单comppare我已经从复选框列表编译的实践。LINQ到比较集合的实体

之前,它是一个复选框列表,这是一个下拉列表,这个查询努力寻找1和实践:

ar = (from a in db.Articles 
     from p in a.Practices 
     where p.ID == practiceID 
     select a); 

现在,我需要在where子句像常规的SQL的“IN”的工作。我从一个复选框列表编译的实践集合需要与我的搜索的db.Articles.Practices进行比较。

需要任何建议或澄清?

回答

2

假设:列表practiseIds

ar = (from a in db.Articles 
    from p in db.Practices 
    where practiseIds.Contains(p.ID) 
    select a); 

但是需要一些澄清:

IN不是EF中的第一类支持的SQL方法,所以上面的代码实际上会变成一个or列表(这可能已经在.net 4版本的EF中解决了) - http://blogs.msdn.com/b/adonet/archive/2009/08/05/improvements-to-the-generated-sql-in-net-4-0-beta1.aspx

的伪码 -

Select * From db.Articles 
inner join db.Practices on <relation> 
Where db.Practices.practiceid = @p0 || db.Practices.practiceid = @p1 || etc.. 
+0

顺便提一句,两者都应该在SQL中生成相同的查询计划 – BrokenGlass

+0

两个答案都是相同的......这是第一个,所以得到了检查。是的,那是有效的......我是Linq的新手,非常感谢诺基亚。 – richman64

2

的ID集合中只是通过为阵列practiceIds和使用Contains()查询:

ar = (from a in db.Articles 
     from p in a.Practices 
     where practiceIds.Contains(p.ID) 
     select a); 
+0

这只要两个集合来自相同的查询环境中工作。如果'practiceIds'在一个内存上下文中并且'db.Articles'从数据上下文中提取,它会抛出运行时异常。为了解决这个问题,'ar'需要提取where子句并发送'ToList()'。一旦它是一个IEnumerable而不是IQueryable,那么序列可以与'.Where(x => practiceIds.Contains(x.ID))'进行比较。 +1顺便说一句:) –

+0

哈。 –

+0

@JoelEtherton:我假设它只是一个根本没有连接到数据上下文的原语集合 - OP说他有一套从复选框编译的IDs – BrokenGlass