Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ To SQL:跨多个表过滤查询_C#_.net_Linq To Sql - Fatal编程技术网

C# LINQ To SQL:跨多个表过滤查询

C# LINQ To SQL:跨多个表过滤查询,c#,.net,linq-to-sql,C#,.net,Linq To Sql,我从上一个家伙那里继承了这个项目,目前我正在将大量从字符串SQL查询转换为LINQ到SQL的过程中,我被告知这是使.NET中的生活值得活下去的原因。然而,我在筛选多对多关系时遇到了问题 该系统是一个项目管理内联网事务。注释的主要对象/表格是Project。Project有许多市场,它使用中间表linkProjectMarkets来链接它们。还有很多其他的事情要做,但如果我能理解这个问题,我会处理好的,这一切都是相似的 简而言之,在我的一生中,我无法使用一组复选框提供的市场ID列表,并将项目列表筛

我从上一个家伙那里继承了这个项目,目前我正在将大量从字符串SQL查询转换为LINQ到SQL的过程中,我被告知这是使.NET中的生活值得活下去的原因。然而,我在筛选多对多关系时遇到了问题

该系统是一个项目管理内联网事务。注释的主要对象/表格是Project。Project有许多市场,它使用中间表linkProjectMarkets来链接它们。还有很多其他的事情要做,但如果我能理解这个问题,我会处理好的,这一切都是相似的

简而言之,在我的一生中,我无法使用一组复选框提供的市场ID列表,并将项目列表筛选为与提供ID的市场相关的项目

该模式的要点是:

项目:int-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)。如果您对答案感到满意,请单击答案旁边投票面板下方的勾号。谢谢,很高兴它起作用了。当然,我只是在等着看是否有人能做得更好。