【问题标题】:Cannot get Linq Query method to work with contains [closed]无法让 Linq Query 方法使用包含 [关闭]
【发布时间】:2021-10-06 18:29:39
【问题描述】:

我正在尝试使用一个查询的结果来为另一个查询提供可接受值的列表。我正在使用查询方法,因为我更喜欢它。 vars morscontent 提供了一个列表,每个迭代都有多个成员,但我似乎无法将它们作为一个整体来访问,而无需访问其中一个单独的计数。例如: morsContent[1].MORACODE 有效,但我不只是第一项中的一个实例,而是所有要搜索的实例。 这是我的非工作代码:

using (var a2Entity = new A2_Data_UATEntities())
{

    var morsContent = (from a in a2Entity.MORDetails
                        where a.MORCODE == this.dropDown1.SelectedItem.Label
                        select a ).ToList();

    var dataResults = (from b in a2Entity.SCADA_DATA
                        where b.COLDATE >= dateCheck1 && b.COLDATE <= dateCheck2
                        && morsContent.Contains(b.acode)
                        && morsContent[1].MORACODE
                        select b).ToList();
}

【问题讨论】:

  • 我怀疑您或多或少地收到了一条类似于 Contains cannot be used, because it's not part of Entity Framework Linq. 的错误消息 补救措施是使用有效的 EF Linq 将所有数据传递给客户端,然后将 Contains 应用于结果数据。
  • 你要发布所有的课程,很难理解你在做什么
  • “非工作代码”是什么意思?错误信息?错误的结果?在 C# 中,类型规则。 morsContent 的类型是什么? (提示:List&lt;MORDetails&gt;b.acode 的类型是什么?Contains 需要什么类型?建议:从morsContent 中删除ToList()。(不好的名字。)如果你不需要morsContent别的,把select a改成select a.code。如果你确实需要,把dataResults改成测试morsContent.Select(c =&gt; c.code).Contains(b.acode)。如果你需要它是一个列表,添加一个新变量var morsContentList = morsContent.ToList();

标签: c# .net entity-framework linq


【解决方案1】:

也许你可以为它使用一个子查询,Entity Framework 会很容易解决。鉴于您没有提供有关数据类型等的更多详细信息,我不确定这是否是最好的情况。

var dataResults = (from b in a2Entity.SCADA_DATA
                    let codes = (from a in a2Entity.MORDetails
                                 where a.MORCODE == this.dropDown1.SelectedItem.Label
                                 select a.MORACODE /* not sure what prop you need */)
                    where b.COLDATE >= dateCheck1 && b.COLDATE <= dateCheck2
                    && codes.Contains(b.acode)
                    select b)
                    .ToList();

根据您在第一个查询中的项目数量,使用array.Contains(element) 将生成一个IN 语句,将数组的所有元素绑定到您的查询中。 IT 可能对您在数据库级别的执行计划不利,此外,还存在一些限制,具体取决于您使用的数据库(您可以在 IN 上使用的最大项目数)。使用子查询,数据库将为您管理它,但是,是的,它需要针对您的模型进行测试,以 100% 确定什么是最佳选择。

【讨论】:

  • 它们是字符串
  • 这段代码可以工作,但是在玩弄它之后你是对的,这对我来说不是最好的方法。我很快意识到获取比需要更大的数据集仍然比使用我最初打算的方法更快。感谢您的帮助。
  • 您好 Julius,很高兴帮助您。我在我的答案的代码后添加了一条评论,我认为这对这篇文章有帮助。谢谢!
【解决方案2】:

使用 linq 你可以做这样的事情。

    var dataResults = a2Entity.SCADA_DATA.Where(x => 
    x.COLDATE >= dateCheck1
     && x.COLDATE <= dateCheck2
     && morsContent.Contains(x.acode)
     && morsContent.Where(y => y.MORACODE == x.??).Any())
    .ToList()
    

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 2013-03-29
    • 1970-01-01
    • 2021-07-03
    • 2013-05-23
    • 2012-06-26
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多