我有一个小问题,我不能解决。我想在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)匹配的所有记录的结果。子表是来自MyData的明细表,Id是Guid类型。我尝试了几种方法(将Guid转换为字符串,然后使用.Contains,等等),但我总是得到一个异常,上面写着:
“VS2008 to Entities”无法识别方法“Boolean Contains(System.Guid)”,也无法将此方法转换为内存表达式。(因为我使用的是德语版本的'Linq )。
我在.NET 3.5中使用L2E,在VS2008中使用C#编程。
我已经读了几个例子,但它不起作用。是不是因为使用Guid而不是字符串?我还试图编写自己的比较函数,但我不知道如何集成它,以便.NET调用我的函数进行比较。
发布于 2010-04-19 23:00:13
您可以在arrayToSearch上使用Any()吗
datatoget = objectContext
.MyDataSet
.Where(p => arrayToSearch.Any(i => i == p.Subtable.Id.ToString())
.ToList();发布于 2010-04-19 23:17:03
我会尝试这两种方法:
第一种方法:不要转换任何东西。这里假设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-20 19:58:07
谢谢你在我的问题上花时间。Robert Havery的链接做到了:)正如我所看到的,对于实体和.NET3.5,.Contains()不能(很好地)与Linq一起工作。如果不编写扩展方法,就不可能做到这一点。我曾经尝试过使用LinqPad,在使用Linq2SQL时,使用.Contains()没有问题。它像承诺的那样做了。对于Linq to Entities,没有任何承诺,除非我总是得到异常(但这也是一个承诺:)。
特别感谢Robert Havery和所有其他帮助我的人。
https://stackoverflow.com/questions/2668376
复制相似问题