我有一点我无法解决的问题。 我想在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调用我的函数进行比较。
答案 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以及所有帮助过我的人。