使用List <Tuple <int,int >>在Linq中返回数据

Tom*_*len 5 c# linq

鉴于:

List<int> myList;
Run Code Online (Sandbox Code Playgroud)

如果我想返回记录ID包含在此列表中的数据,我只需:

var q = db.Table.Where(c=> myList.Contains(c.ID));
Run Code Online (Sandbox Code Playgroud)

但是,鉴于:

List<Tuple<int, int>> myList;
Run Code Online (Sandbox Code Playgroud)

如何编写Linq查询以返回满足两个条件的记录?有一个数据点,我会写:

var q = db.Table.Where(c=>
            c.ID == myList.Item1
            && c.AnotherValue == myList.Item2);
Run Code Online (Sandbox Code Playgroud)

如何将上述语句转换为工作List<Tuple<int, int>>

oct*_*ccl 6

A Tuple是一个不能由Linq Provider转换为sql的结构.解决方案可能是切换到Linq to Objects

var q = db.Table.AsEnumerable()
                .Where(c=> myList.Any(tuple => c.ID == tuple.Item1 &&
                                           c.AnotherValue == tuple.Item2));
Run Code Online (Sandbox Code Playgroud)

但是这个解决方案的坏处是你要从该表加载所有行来过滤内存.

另一种解决方案可能是使用Linqkit:

var predicate = PredicateBuilder.False<Table>();

foreach (string t in myList)
{
    predicate = predicate.Or(c =>c.ID == t.Item1 && c.AnotherValue == t.Item2));
}

db.Table.AsExpandable().Where(predicate);
Run Code Online (Sandbox Code Playgroud)

您将在此链接中找到有关此最后一个解决方案的更多信息