2013-05-25 53 views
1

我有2个查询工作,我希望能够结合它们来减少数据库调用。结合LINQ查询来减少数据库调用

   var locations = from l in db.Locations 
           where l.LocationID.Equals(TagID) 
           select l; 

我这样做是因为我需要l.Name,但有没有办法将上述结果放到下面的查询中?

   articles = from a in db.Articles 
           where 
           (
           from l in a.Locations 
           where l.LocationID.Equals(TagID) 
           select l 
           ).Any() 
           select a; 

我真的会减少任何数据库调用吗?

+0

你可以把它转换成一个加入?或者,每个标签ID有多个位置? – Rup

+0

TagID将只有一个位置,一个连接听起来像是正确的方式,我只是没有足够的技巧在Linq中实现它! –

回答

0

这似乎有点复杂,因为Locations看起来是Articles的多值属性,而您只想加载正确的值。根据this answer对于类似的问题,您需要使用select来一次性单独返回它们,例如,

var articles = from a in db.Articles 
       select new { 
        Article = a, 
        Location = a.Locations.Where(l => l.LocationId == TagId) 
       }; 

首先使用join失败的尝试:(我通常用其他的LINQ的语法,但这样的道歉,如果我做了一些愚蠢的存在)

var articlesAndLocations = from a in db.Articles 
          join l in a.Locations 
          on l.LocationID equals TagID 
          select new { Article = a, Location = l }; 

+0

谢谢,但似乎并没有工作 - 我可以在第二行的'a'上发生错误,即“当前上下文中不存在'名称' –

+0

对,对不起,我在那里猜测: - /第二次尝试,更接近链接的答案,虽然我不太确定这将是一个单一的数据库命中。如果失败了,我没有想法,对不起 – Rup

0

莫非你不使用这里的Include()方法来拉入与每篇文章相关的位置,然后选择文章和位置对象?或您需要的属性。

include方法将确保您不需要两次插入数据库,但将允许您访问相关实体的属性。

你可能会需要使用contains方法上一个IEnumerable我相信,这样的事情:

var tagIdList = new List() { TagID }; 

var articles = from a in db.Articles.Include("Locations") 
      where tagIdList.Contains(from l in a.Locations select l.LocationID) 
      select new { a, a.Locations.Name }; 

(未经测试)

+0

看起来很有希望,但我在Locations.LocationID上遇到错误在第二行:System.Collections.Generic.ICollection '不包含'LocationID'的定义,也没有接受类型'System.Collections.Generic.ICollection'的第一个参数的扩展方法'LocationID' '可以找到(你是否缺少使用指令或程序集引用?) –

+0

啊,对,你需要将你的位置缩减到一条记录,或使用contains语句。 – dougajmcdonald