我有一个我无法解决的小问题。我想在Linq中使用SQL语句。我已经在该论坛和其他论坛中阅读了必须使用.Contains(带有反向思维符号:-)的信息。作为输入,我有一个向导列表。我首先将它们复制到数组中,然后执行类似的操作:
datatoget = (from p in objectContext.MyDataSet
where ArrayToSearch.Contains(p.Subtable.Id.ToString())
select p).ToList();
datatoget是其中应存储与Subtable.Id(这是Guid)匹配的所有记录的结果。子表是MyData的明细表,而Id是Guid类型。我已经尝试了几件事(将Guid转换为String,然后使用.Contains等),但我总是得到一个异常,它说:
'Linq to Entities'无法识别方法'Boolean Contains(System.Guid)和无法将此方法转换为内存表达式。(之类的事情,因为我使用的是VS2008的德语版)
我正在将L2E与.NET 3.5一起使用,并且正在VS 2008中以C#进行编程。
我已经阅读了几个示例,但是没有用。可能是因为使用了Guid而不是字符串吗?我也尝试编写自己的比较函数,但是我不知道如何集成它,因此.NET会调用我的比较函数。
我将尝试这两种方法:
第一种方法:不进行任何转换。假定将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();
如果这些方法都不起作用,那么我们可能需要查看有关该问题的更多信息,例如数据库的架构,实体的形状等。
感谢您花时间在我的问题上。罗伯·哈弗里(Robert Havery)的链接成功了如我所见,.Contains()无法与Linq for Entities和.NET3.5一起使用(很好)。不编写扩展方法就不可能这样做。我已经使用LinqPad进行了一些尝试,当使用Linq 2 SQL时,.Contains()没问题。它按照承诺做了。对于Linq to Entities,除了我总是得到Exception之外,没有任何承诺(但这也是一个诺言:))。
非常感谢Robert Havery和其他所有帮助过我的人。
您可以在Any()
上使用arrayToSearch
吗?
datatoget = objectContext
.MyDataSet
.Where(p => arrayToSearch.Any(i => i == p.Subtable.Id.ToString())
.ToList();