无论是内存数据集(Linq-to-Objects)还是数据库中的集合lstR
,您都可以这样做:db.Menu
IQueryable
menu =
(from s in db.Menu
where lstR.Select(r => r.Id)
.Contains(s.R.Id)
select s.MenuText)
.Distinct();
或这个:
menu =
(from s in db.Menu
join r in lstR on s.R.Id equals r.Id
select s.MenuText)
.Distinct();
但是,由于List<R>
存在于内存中并且db.Menu
是IQueryable
,因此您的选择是有限的。您可以实现db.Menu
为IEnumerable
,因此您可以在内存中处理它:
List<R> lstR = GetR();
menu =
(from s in db.Menu.AsEnumerable()
join r in lstR on s.R.Id equals r.Id
select s.MenuText)
.Distinct();
但是,如果有很多记录,这可能会很昂贵。最好做这样的事情,诚然,这看起来与你已经拥有的没什么不同:
List<R> lstR = GetR();
var ids = lstR.Select(r => r.Id).ToList(); // or .ToArray();
menu =
(from s in db.Menu
where ids.Contains(s.R.Id)
select s.MenuText)
.Distinct();
但事实上,最好的选择是看看你是否可以重构GetR
,以便它IQueryable<R>
从你的数据库中返回一个。这样您就可以同时使用前两个选项,而无需先将任何集合具体化到内存中。顺便说一句,一旦你完成了这些并设置了导航属性,你可能会做这样的事情:
IQueryable<R> lstR = GetR();
menu =
(from r in lstR
from s in r.Menus
select s.MenuText)
.Distinct();