1

我在运行时将未知数量的复杂键传递到我的函数中。它们的结构如下:

var keys = new List<List<string>>
{
    new List<string> { "1", "a" },
    new List<string> { "2", "b" },
    new List<string> { "3", "c" }
};

内部列表总是有两个值。外部列表可以有 n 个值。我正在尝试查询一个表,其中记录与列表中的任何对匹配。我试过这样的查询:

var filtered =
    dataContext.T.Where(
        s => keys.Any(k => 
                k[0] == s.Column0 
                && k[1] == s.Column1));

此时,LinqToEntities 失败,因为 linq 似乎无法处理 .Any() 方法内的列表(或数组?)。

这是我运行此代码时遇到的错误:

"LINQ to Entities does not recognize the method 'System.String get_Item(Int32)' method, and this method cannot be translated into a store expression."

所以我的问题是,如何查询与列表中任何一对值匹配的记录?只要我可以查询一组对中的任何一个,我就可以更改有关结构的任何内容。

感谢您的任何指导。

4

2 回答 2

2

不要认为您可以在 linq 2 实体中使用任何像这样的枚举。

一种解决方法是连接你的对,中间有一个“应该永远不会出现”的字符串。

var concatenatedkeys = keys.Select(m => m[0] + "~" + m[1]).ToList();

var filtered = 
     dataContext.T.Where(s => concatenatedKeys.Contains(
                                             s.Column0 ?? string.Empty + 
                                             "~" + 
                                             s.Column1));
于 2013-10-14T20:30:00.857 回答
0

答案确实解决了我在问题中提出的问题。但是,一旦我需要比较链接实体之间的值,我就遇到了类似的问题。

串联解决方案在这种情况下遇到了问题:

var filtered = 
     dataContext.T.Where(s => concatenatedKeys.Contains(
                                             s.AnotherEntity.Column0 ?? string.Empty + 
                                             "~" + 
                                             s.AnotherEntity.Column1));

为了解决这个问题,我最终使用LinqKit使用PredicateBuilder创建了 .Where() 表达式。

于 2013-10-15T13:56:53.117 回答