0

我有一个我无法解决的小问题。我想在 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,并在 C# 中使用 VS 2008 进行编程。

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

4

3 回答 3

0

你可以在Any()上使用arrayToSearch吗?

 datatoget = objectContext
              .MyDataSet
              .Where(p => arrayToSearch.Any(i => i == p.Subtable.Id.ToString()) 
              .ToList();
于 2010-04-19T15:00:12.507 回答
0

我会尝试这两种方法:

第一种方法:不要转换任何东西。这假定 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-04-19T15:17:03.277 回答
0

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

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

于 2010-04-20T11:58:06.590 回答