包含问题

问题描述 投票:0回答:3

我有一个我无法解决的小问题。我想在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会调用我的比较函数。

c# linq .net-3.5 linq-to-entities contains
3个回答
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
投票

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

 datatoget = objectContext
              .MyDataSet
              .Where(p => arrayToSearch.Any(i => i == p.Subtable.Id.ToString()) 
              .ToList();
© www.soinside.com 2019 - 2024. All rights reserved.