【发布时间】:2011-01-21 00:24:36
【问题描述】:
使用 linq,我必须检查数组中是否存在行的值。
相当于sql查询:
WHERE ID IN (2,3,4,5)
我该怎么做?
【问题讨论】:
使用 linq,我必须检查数组中是否存在行的值。
相当于sql查询:
WHERE ID IN (2,3,4,5)
我该怎么做?
【问题讨论】:
.包含
var resultset = from x in collection where new[] {2,3,4,5}.Contains(x) select x
当然,对于你的简单问题,你可以有类似的东西:
var resultset = from x in collection where x >= 2 && x <= 5 select x
【讨论】:
int[] does not contain a definition of contains.
IEnumerable<T>.Contains(T) 语句应该可以满足您的需求。
【讨论】:
db.SomeTable.Where(x => new[] {2,3,4,5}.Contains(x));
或
from x in db.SomeTable
where new[] {2,3,4,5}.Contains(x)
【讨论】:
使用IEnumerable.Contains() 执行等效的 SQL IN。
var idlist = new int[] { 2, 3, 4, 5 };
var result = from x in source
where idlist.Contains(x.Id)
select x;
【讨论】:
一个非常基本的使用 .Contains() 的例子
List<int> list = new List<int>();
for (int k = 1; k < 10; k++)
{
list.Add(k);
}
int[] conditionList = new int[]{2,3,4};
var a = (from test in list
where conditionList.Contains(test)
select test);
【讨论】:
for 循环更改为 IEnumerable<int> list = Enumerable.Range(1, 10); 来清理很多内容
你可以编写帮助方法:
public bool Contains(int x, params int[] set) {
return set.Contains(x);
}
并使用短代码:
var resultset = from x in collection
where Contains(x, 2, 3, 4, 5)
select x;
【讨论】:
Intersect 和 except 更简洁一些,也可能会更快一些。
输入
collection.Intersect(new[] {2,3,4,5});
不在
collection.Except(new[] {2,3,4,5});
或
IN 的方法语法
collection.Where(x => new[] {2,3,4,5}.Contains(x));
而不是在
collection.Where(x => !(new[] {2,3,4,5}.Contains(x)));
【讨论】:
以下是一种通用扩展方法,可用于在值列表中搜索值:
public static bool In<T>(this T searchValue, params T[] valuesToSearch)
{
if (valuesToSearch == null)
return false;
for (int i = 0; i < valuesToSearch.Length; i++)
if (searchValue.Equals(valuesToSearch[i]))
return true;
return false;
}
这可以用作:
int i = 5;
i.In(45, 44, 5, 234); // Returns true
string s = "test";
s.In("aa", "b", "c"); // Returns false
这在条件语句中很方便。
【讨论】:
当Contains 函数用于原语时,上述情况有效,但如果您正在处理对象(例如myListOrArrayOfObjs.Contains(efObj))怎么办?
我找到了解决办法!将您的efObj 转换为string,每个字段用_ 分隔(您几乎可以将其视为您的obj 的CSV 表示)
这样的例子可能如下所示:
var reqAssetsDataStringRep = new List<string>();
foreach (var ra in onDemandQueueJobRequest.RequestedAssets)
{
reqAssetsDataStringRep.Add(ra.RequestedAssetId + "_" + ra.ImageId);
}
var requestedAssets = await (from reqAsset in DbContext.RequestedAssets
join image in DbContext.Images on reqAsset.ImageId equals image.Id
where reqAssetsDataStringRep.Contains(reqAsset.Id + "_" + image.Id)
select reqAsset
).ToListAsync();
【讨论】: