C# LINQ To SQL:跨多个表过滤查询
我从上一个家伙那里继承了这个项目,目前我正在将大量从字符串SQL查询转换为LINQ到SQL的过程中,我被告知这是使.NET中的生活值得活下去的原因。然而,我在筛选多对多关系时遇到了问题 该系统是一个项目管理内联网事务。注释的主要对象/表格是Project。Project有许多市场,它使用中间表linkProjectMarkets来链接它们。还有很多其他的事情要做,但如果我能理解这个问题,我会处理好的,这一切都是相似的 简而言之,在我的一生中,我无法使用一组复选框提供的市场ID列表,并将项目列表筛选为与提供ID的市场相关的项目 该模式的要点是: 项目:int-id,…(一组元数据)C# LINQ To SQL:跨多个表过滤查询,c#,.net,linq-to-sql,C#,.net,Linq To Sql,我从上一个家伙那里继承了这个项目,目前我正在将大量从字符串SQL查询转换为LINQ到SQL的过程中,我被告知这是使.NET中的生活值得活下去的原因。然而,我在筛选多对多关系时遇到了问题 该系统是一个项目管理内联网事务。注释的主要对象/表格是Project。Project有许多市场,它使用中间表linkProjectMarkets来链接它们。还有很多其他的事情要做,但如果我能理解这个问题,我会处理好的,这一切都是相似的 简而言之,在我的一生中,我无法使用一组复选框提供的市场ID列表,并将项目列表筛
linkProjectMarkets:国际项目,国际市场
市场:整数id,字符串摘要 所有这些,任何更多的,都是在一个dbml文件和伴随生成的代码中定义的。为方便项目和市场之间的访问,项目采用以下附加方法:
public partial class project
{
public EntitySet<market> markets
{
get
{
return (EntitySet<market>)from lpm in this._linkProjectMarkets
select lpm.market;
}
set
{
var set = (EntitySet<market>)from lpm in this._linkProjectMarkets
select lpm.market;
set.Assign(value);
}
}
}
还有许多其他的过滤器需要应用,这就是为什么我要分步执行,而不是一条LINQ语句
我检查了设计器代码;linkProjectMarkets中的市场是公开的,id在市场中是公开的。这是我第一次真正体验C#/.NET,所以可能我不理解错误信息。如果我提供的信息太多、不够或不正确,请道歉。请帮忙
顺便说一句,我已经试过LINQ to Entities,我必须有一个很好的理由再试一次
编辑
以下是我尝试过的其他方法:
projects = projects.Where(
p => MarketFilterList.Intersect(from m in p.markets select m.id).Count() > 0
);
那个人告诉我:
除了Contains()运算符外,查询运算符的LINQ to SQL实现中不能使用局部序列
重新编辑
以下是基于JTew答案的解决方案。如果有人知道project不能直接进入市场的真正原因,我很想听听
projects = projects.Where(p => (from lpm in db.linkProjectMarkets
where MarketFilterList.Contains(lpm.marketId)
select lpm.project).Contains(p));
我会这样做:
var projMarkLink = from lpm in db.linkProjectMarkets select lpm;
建立IQueryable,然后在后续行中添加筛选器:
foreach (int mid in MarketFilterList){
projMarkLink = projMarkLink.Where(l => l.mid == mid);
}
然后选择所需的结果:
return (from lpm in projMarkLink
from p in projMarkLink.Projects
select p).ToList();
您可以更进一步,删除循环,读取
我会这样做:
var projMarkLink = from lpm in db.linkProjectMarkets select lpm;
建立IQueryable,然后在后续行中添加筛选器:
foreach (int mid in MarketFilterList){
projMarkLink = projMarkLink.Where(l => l.mid == mid);
}
然后选择所需的结果:
return (from lpm in projMarkLink
from p in projMarkLink.Projects
select p).ToList();
您可以更进一步,删除循环,读取
谢谢直接使用linkProjectMarkets表就成功了。我不太乐意打破projectmarket的抽象,但只要它能工作就行了。在我的例子中,抽象是通过代码上的存储库模式实现的,我只会把它放在数据层。查询从linkProjectMarkets开始,因为它在执行时生成最佳sql(至少使用EF)。如果您对答案感到满意,请单击答案旁边投票面板下方的勾号。谢谢,很高兴它成功了。但当然,我只是在等着看是否有人能做得更好。谢谢!直接使用linkProjectMarkets表就成功了。我不太乐意打破projectmarket的抽象,但只要它能工作就行了。在我的例子中,抽象是通过代码上的存储库模式实现的,我只会把它放在数据层。查询从linkProjectMarkets开始,因为它在执行时生成最佳sql(至少使用EF)。如果您对答案感到满意,请单击答案旁边投票面板下方的勾号。谢谢,很高兴它起作用了。当然,我只是在等着看是否有人能做得更好。