【问题标题】:How to iterate over results of LINQ where query results using list<> in C#如何在 C# 中使用 list<> 遍历查询结果的 LINQ 结果
【发布时间】:2013-12-05 01:12:44
【问题描述】:

我对 C# 中的 LINQ 和实体框架相当陌生,并且对于为什么我似乎无法将非常基本的 Where 命令输出作为 List 的结果进行迭代的解释不足。我在一个类中有以下方法来返回结果(为简单起见,我在示例中使用了通用变量名):

public List<MyTable> GetMyList(int ThisID)
{
    return MyEntities.MyTable.Where(c => c.ForeignKey == ThisID).AsEnumerable().ToList();
}

然后在我的页面代码中,我可以调用并遍历结果:

List<MyTable> Table1 = GetMyList(1);
Table1.ForEach(delegate(MyTable TableDelegate)
{
    string Value = TableDelegate.Column1
});

除了非常重要的一点,“Column1”的值永远不会改变,这一切都有效。在我正在处理的示例中,我使用我知道返回 3 条记录的值(如示例中的“ForeignKey”)提交查询,并且对于这 3 条记录,我知道“Column1”的值是每个人都不一样。然而,我得到的是第一条记录的 3 个实例。即,“Column1”的值不会随着“ForEach”的迭代而改变。我已经确认它使用断点进行了正确的迭代。

我尝试了不同的循环结构方法,包括普通的foreach 语句,以及使用Table1Count 索引作为限制的标准for 语句。结果相同。

挠头……

【问题讨论】:

  • 您能否确认Table1 之前 中的第一行实际上有 3 个实例?还是它们是不同的行?
  • 不确定这意味着什么——抱歉...例如,当针对数据源(SQL Server)运行时,有问题的查询肯定会返回三个不同的不同行。
  • 我的意思是..当您调试时,您的List&lt;MyTable&gt; 列表是否包含那些不同的行?我只是在检查您如何确认它们是不同的。我正在尝试确定您是否使用自己的 SQL 查询手动查询数据库以确认行是不同的。或者您是否已单步执行您的代码并且 LINQ 肯定会返回您不同的行。
  • 您所做的只是一遍又一遍地将局部变量的值设置为等于 Column1 的值,该变量永远不会退出该循环。此外,您似乎在这里有很多循环复杂性。也许解释一下你希望你的最终结果是什么?
  • 基本上,如果我理解正确,这不应该发生。您正在使用ForEach 的什么实现?这是习俗吗?我认为我们需要查看更多代码。

标签: c# asp.net linq entity-framework ienumerable


【解决方案1】:

我不确定您要完成什么,所以希望这至少会有所帮助。为了便于理解,我更改了一些名称:

public void MyMethod()
{
    // get records with the id 4
    var myList = GetMyList(4);

    // get the property called Column1 for each one of those records and add them to this list (for demonstration)
    var listOfColumn1 = new List<string>(); // lets assume that column holds a string
    foreach(User usr in myList)
    {
        listOfColumn1.Add(thing);
    }

    // or in a more linq-ish way
    listOfColumn1 = myList.Select(record => record.Column1).ToList();

}

public List<User> GetMyList(int departmentId)
{
    // return a list of users that have the specified department id
    return MyEntities.Users.Where(user => user.DepartmentId== departmentId).ToList();
}


// OR do it in one operation
public void DisplayDepartmentUsers(int departmentId)
{
    MyEntities.Users // from my user table
        .Where(user => user.DepartmentId == departmentId) // get everyone with this department id
        .Select(record => record.Column1) // only select the first column (a string in this case)
        .ToList() // make a list out of the resultant enumerable
        .ForEach(Console.WriteLine); // for each result, run this method (write out to console)
}

【讨论】:

    【解决方案2】:

    我认为这与您的问题无关,但我认为它会帮助您了解 LINQ:

    public List<MyTable> GetMyList(int ThisID)`
    {
        return MyEntities.MyTable.Where(c => c.ForeignKey == ThisID).AsEnumerable().ToList();`
    }
    

    在此示例中,您不需要使用 AsEnumerable,因为所有 LINQ 方法都返回 IEnumerable&lt;T&gt;

    【讨论】:

    • 从技术上讲,因为这是实体框架,它返回一个IQueryable&lt;T&gt;,所以 AsEnumerable 正在包装它。换句话说,AsEnumerable 正在阻止任何其他扩展方法修改数据库查询。所以这不是一对一的比较。
    【解决方案3】:

    我想出了问题所在。它与代码本身完全无关,这很好。我试图查询的视图在输出中缺少唯一标识符列(PK 列),如底层 .edmx 对象所示。一旦我添加进去,没问题。选择查询现在抓取唯一的行。对我来说这仍然有点奇怪,但你去吧。

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多