2010-04-19 88 views
0

我有一个小问题,我无法解决。 我想在Linq中使用SQL-In-Statement。我已经在这个论坛和其他论坛上读过我必须使用.Contains(带有逆向思考符号:-))。 作为输入,我有一个Guid列表。我第一次复制他们到一个数组,然后做类似的东西:问题与包含

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的字符串,然后使用。载等), 但我总是得到一个异常,说:

“LINQ到实体”不能识别方法“布尔包含(System.Guid)和 无法将此方法转换为内存表达式。 (类似的东西,因为我使用VS2008的德国版)

我使用与.NET 3.5 L2E和C#与VS AM程序2008

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

+3

另请参见http://stackoverflow.com/questions/374267/contains-workaround-using-linq-to-entities – 2010-04-19 14:57:40

+0

罗伯特是正确的这是一个3.5的副本,但也4.0直接支持'包含()'。 – 2010-04-19 16:11:49

回答

0

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

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

善良,

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(); 

如果这些都不能正常工作,那么我们可能需要看到更多信息有关的问题,如数据库的模式,实体的形状等

0

感谢您花时间在我的问题上。来自Robert Havery的链接:) 正如我所看到的.Contains()对Linq for Entities和.NET3.5不起作用(很好)。 如果不编写扩展方法,就不可能做到这一点。 我试了一下LinqPad,当使用Linq 2 SQL时,.Contains()没有问题。它按承诺做到了。 Linq to Entities没有承诺,除了我总是得到Exception(但这也是一个承诺:))。

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

+0

正如Robert的链接所显示的那样,您可以使用3.5中的扩展方法进行操作。 – 2010-04-20 13:19:37