【问题标题】:Linq query returns unwanted results as wellLinq 查询也会返回不需要的结果
【发布时间】:2019-04-22 00:56:21
【问题描述】:

我是 linq 和 C# 的新手,试图通过某个属性查询复杂对象。场景是我有一个currentPerson 对象列表,其中包括PersonAddressesDisplay 属性,它是一个字符串。我正在循环尝试通过地址(PersonAddressesDisplay)在数据库中查找已保存的person 对象的列表。现在由于某些奇怪的原因,我也得到了不需要的结果(不同的字符串也出现在 matchAddresses 列表中)。查询如下:

        foreach(var currentPerson in PersonsListToSave) {
         .
         .
         .
         var matchAddresses = db.PersonAddresses.Include(p => p.Persons).AsEnumerable().
         Where(add => currentPerson.Addresses
          .Any(personAddress => personAddress.PersonAddressesDisplay == add.PersonAddressesDisplay)).ToList();
         // matchAddresses includes unwanted results
         .
         .
         .
        }

【问题讨论】:

  • 请举例输入输出。
  • 虽然没有回答你的问题,但我想知道为什么打电话给AsEnumerable()?在应用 Where 过滤器之前,这会将与 Persons 连接的整个 PersonAddresses 表拉到内存中。

标签: c# entity-framework linq


【解决方案1】:

如果要提取至少与currentPerson 共享地址的PersonAddress+Person 对象,则可以直接为此目的构造查询:

foreach(var currentPerson in PersonsListToSave)
{
    // ...
    IEnumerable<string> currentAddresses = 
        currentPerson.Addresses.Select(personAddr => personAddr.PersonAddressesDisplay);

    var matchAddresses = db.PersonAddresses.Include(p => p.Persons)
        .Where(addr => currentAddresses.Contains(addr.PersonAddressesDisplay))
        .ToList();
    // ...
}

我无法尝试此代码,但我认为通过在后台构建WHERE - IN SQL 过滤器,它应该可以正常工作。如果这不能解决问题,请尝试并发送更多信息。

【讨论】:

    猜你喜欢
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2020-03-20
    • 2023-04-05
    • 2017-09-17
    • 1970-01-01
    相关资源
    最近更新 更多