首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Linq to SQL how to do "where [column] in (list of values)“

Linq to SQL how to do "where [column] in (list of values)“
EN

Stack Overflow用户
提问于 2009-07-02 16:59:58
回答 6查看 142.1K关注 0票数 108

我有一个获取id列表的函数,我需要返回一个列表,该列表与与id相关联的描述相匹配。例如:

代码语言:javascript
复制
public class CodeData
{
    string CodeId {get; set;}
    string Description {get; set;}
}

public List<CodeData> GetCodeDescriptionList(List<string> codeIDs)
    //Given the list of institution codes, return a list of CodeData
    //having the given CodeIds
}

因此,如果我自己为此创建sql,我只需执行如下操作(其中in子句包含codeIds参数中的所有值):

代码语言:javascript
复制
Select CodeId, Description FROM CodeTable WHERE CodeId IN ('1a','2b','3')

在Linq to Sql中,我似乎找不到" In“子句的等价物。到目前为止,我发现的最好的(不起作用)是:

代码语言:javascript
复制
 var foo = from codeData in channel.AsQueryable<CodeData>()
           where codeData.CodeId == "1" || codeData.CodeId == "2"
           select codeData;

问题是,我不能为linq to sql动态生成"OR“子句列表,因为它们是在编译时设置的。

如何使用Linq to Sql实现where子句来检查列是否在动态值列表中?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-07-02 17:04:08

使用

代码语言:javascript
复制
where list.Contains(item.Property)

或者在你的例子中:

代码语言:javascript
复制
var foo = from codeData in channel.AsQueryable<CodeData>()
          where codeIDs.Contains(codeData.CodeId)
          select codeData;

但是你也可以用点符号来做:

代码语言:javascript
复制
var foo = channel.AsQueryable<CodeData>()
                 .Where(codeData => codeIDs.Contains(codeData.CodeId));
票数 170
EN

Stack Overflow用户

发布于 2009-07-02 17:18:26

您还可以使用:

代码语言:javascript
复制
List<int> codes = new List<int>();

codes.add(1);
codes.add(2);

var foo = from codeData in channel.AsQueryable<CodeData>()
          where codes.Any(code => codeData.CodeID.Equals(code))
          select codeData;
票数 27
EN

Stack Overflow用户

发布于 2014-10-18 09:48:46

我一直在使用Jon Skeet的答案中的方法,但我想到了另一个使用Concat的方法。在有限的测试中,Concat方法的性能稍好一些,但这是一个麻烦,我可能会坚持使用Contains,或者我可能会编写一个助手方法来为我做这件事。无论哪种方式,如果有人感兴趣,这里有另一个选择:

该方法

代码语言:javascript
复制
// Given an array of id's
var ids = new Guid[] { ... };

// and a DataContext
var dc = new MyDataContext();

// start the queryable
var query = (
    from thing in dc.Things
    where thing.Id == ids[ 0 ]
    select thing 
);

// then, for each other id
for( var i = 1; i < ids.Count(); i++ ) {
    // select that thing and concat to queryable
    query.Concat(
        from thing in dc.Things
        where thing.Id == ids[ i ]
        select thing
    );
}

性能测试

这根本不是科学的。我想你的数据库结构和列表中涉及的in的数量会有很大的影响。

我设置了一个测试,对ConcatContains分别进行了100次试验,每次试验都需要选择由主键的随机列表指定的25行。我已经运行了大约12次,大多数时候Concat方法的速度要快5- 10%,尽管有一次Contains方法只赢了一点点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1075540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档