“Linq到SQL如何做”;其中(值列表)中的[列]”;

“Linq到SQL如何做”;其中(值列表)中的[列]”;,linq,linq-to-sql,Linq,Linq To Sql,我有一个函数,用于获取id列表,我需要返回与id相关的描述匹配的列表。例如: public class CodeData { string CodeId {get; set;} string Description {get; set;} } public List<CodeData> GetCodeDescriptionList(List<string> codeIDs) //Given the list of institution code

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

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
}
在LINQtoSQL中,我似乎找不到“In”子句的等价物。到目前为止,我发现最好的(不起作用)是:

var foo=来自channel.AsQueryable()中的codeData
其中codeData.CodeId==“1”| | codeData.CodeId==“2”
选择codeData;
问题是,我无法为linq to sql动态生成“OR”子句列表,因为它们是在编译时设置的

如何使用LINQtoSQL实现一个where子句来检查列是否在动态值列表中

使用

where list.Contains(item.Property)
或者在您的情况下:

var foo = from codeData in channel.AsQueryable<CodeData>()
          where codeIDs.Contains(codeData.CodeId)
          select codeData;
var foo=来自channel.AsQueryable()中的codeData
其中CodeId.Contains(codeData.CodeId)
选择codeData;
但您也可以使用点表示法:

var foo = channel.AsQueryable<CodeData>()
                 .Where(codeData => codeIDs.Contains(codeData.CodeId));
var foo=channel.AsQueryable()
其中(codeData=>codeIDs.Contains(codeData.CodeId));
您还可以使用:

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;
列表代码=新列表();
代码。添加(1);
代码。添加(2);
var foo=来自channel.AsQueryable()中的codeData
其中codes.Any(code=>codeData.CodeID.Equals(code))
选择codeData;

我一直在使用Jon Skeet回答中的方法,但另一种方法是使用
Concat
Concat
方法在有限的测试中表现稍好一些,但这是一个麻烦,我可能会坚持使用
Contains
,或者我会编写一个助手方法来完成这项工作。不管怎样,如果有人感兴趣,这里还有另一个选择:

方法
//给定一个id数组
var id=新Guid[]{…};
//和数据上下文
var dc=新的MyDataContext();
//开始查询
变量查询=(
从华盛顿的事情,事情
其中thing.Id==ids[0]
选择事物
);
//那么,对于彼此的id
对于(var i=1;i
性能测试 这一点都不科学。我想您的数据库结构和列表中涉及的ID数量将产生重大影响


我设置了一个测试,其中我做了100个试验,每个试验都是
Concat
Contains
,每个试验都包括选择25行由主键随机列表指定的数据。我已经运行了十几次,大多数情况下,
Concat
方法的速度要快5-10%,尽管有一次,
包含的方法只获得了一点点的成功

 var filterTransNos = (from so in db.SalesOrderDetails
                    where  ItemDescription.Contains(ItemDescription)
                            select new { so.TransNo }).AsEnumerable();    


listreceipt = listreceipt.Where(p => filterTransNos.Any(p2 => p2.TransNo == p.TransNo)).ToList();
        HashSet<String> hs = new HashSet<string>(new String[] { "Pluto", "Earth", "Neptune" });
        String[] arr =
        {
            "Pluto",
            "Earth",
            "Neptune",
            "Jupiter",
            "Saturn",
            "Mercury",
            "Pluto",
            "Earth",
            "Neptune",
            "Jupiter",
            "Saturn",
            "Mercury",
            // etc.
        };
        ICollection<String> coll = arr;

        String[] arrStrFiltered = coll.Where(str => hs.Contains(str)).ToArray();
HashSet hs=新的HashSet(新字符串[]{“冥王星”、“地球”、“海王星”});
字符串[]arr=
{
“冥王星”,
“地球”,
“海王星”,
“木星”,
“土星”,
“水星”,
“冥王星”,
“地球”,
“海王星”,
“木星”,
“土星”,
“水星”,
//等等。
};
ICollection coll=arr;
字符串[]arrStrFiltered=coll.Where(str=>hs.Contains(str)).ToArray();

HashSet基本上接近O(1),所以您的复杂性仍然是O(n)。

无实体框架网络核心2

string[] names = stringsTest.name.Split('|');

if (names.Length > 1)
{
    query = query.Where(w => names.Contains(w.name));
}
else
{
    query = query.Where(w => w.name== stringsTest.name);
}

var listEntity = await query.ToListDtoAsync(stringsTest);

我不得不使用它,因为我们的IQToolkit实现不支持。Contains()在CodeId为整数的情况下如何使用???@KiranSolkar:那么大概
CodeId
将是一个
列表,一切都会很好。@JonSkeet不区分大小写吗?如果codeId是大写字符串的列表,而codeData.codeId是小写字符串,则它将失败。@PersyJack:问题中没有任何关于它必须不区分大小写的内容。至于是否是,我不记得LINQ to SQL默认情况下是强制区分大小写,还是让db设置控制它。@PersyJack LINQ to SQL生成t-SQL查询,然后使用数据库设置区分大小写在SQL Server上运行。尽管如此,如果不小心,在将LINQ应用于内存中对象之前将查询结果具体化,它们可能会遭受大小写不匹配的后果。这是关于LINQ到SQL的问题。这种LINQ到对象的考虑不适用。ICollection也可以来自LINQ-SQL,这是一种通用方法。问题是如何构建一个转换为正确SQL的表达式。这与如何搜索本地收藏无关。你的回答只会迷惑那些没有意识到这种区别的未来读者。
 var filterTransNos = (from so in db.SalesOrderDetails
                    where  ItemDescription.Contains(ItemDescription)
                            select new { so.TransNo }).AsEnumerable();    


listreceipt = listreceipt.Where(p => filterTransNos.Any(p2 => p2.TransNo == p.TransNo)).ToList();
        HashSet<String> hs = new HashSet<string>(new String[] { "Pluto", "Earth", "Neptune" });
        String[] arr =
        {
            "Pluto",
            "Earth",
            "Neptune",
            "Jupiter",
            "Saturn",
            "Mercury",
            "Pluto",
            "Earth",
            "Neptune",
            "Jupiter",
            "Saturn",
            "Mercury",
            // etc.
        };
        ICollection<String> coll = arr;

        String[] arrStrFiltered = coll.Where(str => hs.Contains(str)).ToArray();
string[] names = stringsTest.name.Split('|');

if (names.Length > 1)
{
    query = query.Where(w => names.Contains(w.name));
}
else
{
    query = query.Where(w => w.name== stringsTest.name);
}

var listEntity = await query.ToListDtoAsync(stringsTest);