【问题标题】:Problem with Contains包含问题
【发布时间】:2011-02-09 17:38:45
【问题描述】:

我有一个我无法解决的小问题。 我想在 Linq 中使用 SQL-In-Statement。我在这个论坛和其他论坛中读过我必须使用 .Contains (带有反向思维符号:-))。 作为输入,我有一个指导列表。我首先将它们复制到一个数组中,然后做了类似的事情:

datatoget = (from p in objectContext.MyDataSet
             where ArrayToSearch.Contains(p.Subtable.Id.ToString())
             select p).ToList();

datatoget 是应存储与 Subtable.Id(它是一个 Guid)匹配的所有记录的结果。 Subtable 是 MyData 中的 Detail-Table,Id 是 Guid-Type。 我尝试了几件事(将 Guid 转换为字符串,然后使用 .Contains 等), 但我总是得到一个例外,上面写着:

'Linq to Entities' 无法识别方法 'Boolean Contains(System.Guid) 和 无法将此方法翻译成记忆表达式。 (有点像,因为我用的是德文版的VS2008)

我在 .NET 3.5 中使用 L2E,并在 VS 2008 中使用 C# 编程。

我已经阅读了几个示例,但它不起作用。可能是因为使用 Guid 而不是字符串? 我也尝试编写自己的比较函数,但我不知道如何集成它以便 .NET 调用我的函数进行比较。

【问题讨论】:

标签: c# linq .net-3.5 linq-to-entities contains


【解决方案1】:

您能在arrayToSearch 上使用Any() 吗?

 datatoget = objectContext
              .MyDataSet
              .Where(p => arrayToSearch.Any(i => i == p.Subtable.Id.ToString()) 
              .ToList();

【讨论】:

    【解决方案2】:

    感谢您花时间回答我的问题。 Robert Havery 的链接成功了 :) 正如我所见,.Contains() 不适用于 Linq for Entities 和 .NET3.5。 如果不编写扩展方法,就不可能做到这一点。 我用 LinqPad 尝试了一点,当使用 Linq 2 SQL 时,.Contains() 没有问题。它按照承诺做到了。使用 Linq to Entities 并没有任何承诺,除了我总是得到异常(但这也是一个承诺 :))。

    特别感谢 Robert Havery 和所有帮助过我的人。

    【讨论】:

    • 可以使用 3.5 中的扩展方法来做到这一点,正如 Robert 的链接所示。
    【解决方案3】:

    我会尝试这两种方法:

    第一种方法:不要转换任何东西。这假定 p.Subtable.Id 被定义为数据库中的 GUID。

    Guid[] guids = GetGuids();
    
    var dataToGet = (from p in objectContext.MyDataSet
                     where guids.Contains(p.Subtable.Id)
                     select p).ToList();
    

    第二种方法:首先将所有GUID转换为字符串。

    string[] guids = GetGuids().Select(g => g.ToString()).ToArray();
    
    var dataToGet = (from p in objectContext.MyDataSet
                     where guids.Contains(p.Subtable.Id.ToString())
                     select p).ToList();
    

    如果这两种方法都不起作用,那么我们可能需要查看有关问题的更多信息,例如数据库的架构、实体的形状等。

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 2014-10-09
      • 2011-06-27
      • 2011-10-21
      • 2021-08-19
      • 2019-05-12
      • 1970-01-01
      相关资源
      最近更新 更多