包含问题

时间:2010-04-19 14:51:01

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

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

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转换为String,然后使用.Contains等), 但我总是得到一个例外:

'Linq to Entities'无法识别方法'布尔包含(System.Guid)和 无法将此方法转换为内存表达式。 (类似的东西,因为我使用的是德国版的VS2008)

我正在使用L2E和.NET 3.5,并使用VS 2008进行C#编程。

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

3 个答案:

答案 0 :(得分:0)

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

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

善,

答案 1 :(得分: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();

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

答案 2 :(得分:0)

感谢您花时间回答我的问题。 Robert Havery的链接让它成为了:) 正如我所看到的,.Contains()与Linq for Entities和.NET3.5不兼容。 没有编写扩展方法就没有可能做到这一点。 我已经尝试过使用LinqPad,当使用Linq 2 SQL时,.Contains()没问题。它按照承诺做到了。而Linq to Entities没有承诺,除了我总是得到Exception(但这也是一个承诺:))。

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