【问题标题】:How work the method TrueForAll? C# LINQTrueForAll 方法如何工作? C# LINQ
【发布时间】:2015-03-28 07:03:24
【问题描述】:

我正在尝试使用 TrueForAll 方法,但效果并不好。谁能帮帮我?

我的问题: 我有一个整数列表,例如 myIntList。我需要列表中的所有整数都满足某个条件。

例子:

List<TABLE1> myFinalList = db.TABLE1
    .Where(myTable1 => 
        myIntList.TrueForAll(myInt => 
            db.TABLE2.Any(myTable2 => 
                myTable2.field1 == myTable1.field1 
                && myTable2.field2 == myInt)
            && db.TABLE3.Any(myTable3 =>
                myTable3.field1 == myTable1.field1 
                && myTable3.field2 == myInt))).ToList();

但是当我运行时,我得到以下异常:

LINQ to Entities does not recognize the method 'Boolean TrueForAll[Int32](Int32[], System.Predicate`1[System.Int32])' method, and this method cannot be translated into a store expression.

我已经尝试使用 Array.TrueForAll(),但错误仍然存​​在

... Array.TrueForAll(myIntList.toArray(), myInt => ...

想法?

【问题讨论】:

  • 这意味着您的查询提供程序(实体框架)无法将其转换为正确的 SQL。
  • 虽然您调用的方法不同,但错误和解决方案与此问题中的相同:stackoverflow.com/questions/18788784/… 基本上:您不能在实体中调用 TrueForAll-框架 LINQ 查询,您必须先将其强制为 LINQ to Objects 查询。
  • 我尝试解决 TrueForAll() 方法的问题,但我使用了 All() 方法。我将更多地研究 TrueForAll() 以及他的工作原理。但是,即便如此,还是谢谢你。

标签: c# asp.net-mvc linq


【解决方案1】:

只需使用 linq All() 方法即可。

【讨论】:

    【解决方案2】:

    定义:

    List.TrueForAll 方法

    确定 List 中的每个元素是否与指定谓词定义的条件匹配。

    回答您的问题

    您的代码看起来不错。我对其进行了快速测试(请参见下面的代码),只需确保函数(Any)的返回值是布尔值,如果您查看错误消息,它会说其中一个返回整数(int32)

    using System.Linq;
    using System.Collections;
    
    var myFinalList = db.Tables[0].Select()
                .Where(myTable1 =>
                    myIntList.TrueForAll(myInt =>
    
                        db.Tables[1].Select().Any(myTable2 =>
                            myTable2["field1"] == myTable1["field1"] &&
                            (int)myTable2["field2"] == myInt)
    
                        &&
    
                        db.Tables[2].Select().Any(myTable3 =>
                            myTable3["field1"] == myTable1["field1"] &&
                            (int)myTable3["field2"] == myInt))).ToList();
    

    希望对你有帮助

    【讨论】:

    • 我使用 All() 方法解决了这个问题。我相信异常中提到的 int32 是指传递给 TrueForAll() 方法的谓词的参数类型,但即便如此,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2012-10-10
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多