linq与SQL IN运算符的等效值是什么
使用linq,我必须检查数组中是否存在行的值。linq与SQL IN运算符的等效值是什么,sql,linq,contains,Sql,Linq,Contains,使用linq,我必须检查数组中是否存在行的值。 sql查询的等效项: WHERE ID IN (2,3,4,5) 我该怎么做?.Contains var resultset = from x in collection where new[] {2,3,4,5}.Contains(x) select x List<int> list = new List<int>(); for (int k = 1; k < 10; k++) { list.Add(k)
sql查询的等效项:
WHERE ID IN (2,3,4,5)
我该怎么做?.Contains
var resultset = from x in collection where new[] {2,3,4,5}.Contains(x) select x
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);
当然,对于您的简单问题,您可能会遇到以下情况:
var resultset = from x in collection where x >= 2 && x <= 5 select x
var resultset=来自集合中的x,其中x>=2&&x一个IEnumerable.Contains(T)
语句应该满足您的要求
db.SomeTable.Where(x => new[] {2,3,4,5}.Contains(x));
或
在中执行与SQL相同的操作
使用.Contains()的一个非常基本的示例
List List=新列表();
对于(int k=1;k<10;k++)
{
增加(k);
}
int[]条件列表=新的int[]{2,3,4};
变量a=(来自列表中的测试)
其中conditionList.Contains(测试)
选择测试);
您可以编写帮助方法:
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和Exception更加简洁,可能也会更快一些
在
不在
collection.Except(new[] {2,3,4,5});
或
中的方法语法
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;
}
这在条件语句中很方便。当对原语使用Contains
函数时,上述情况会起作用,但如果您处理的是对象(例如myListOrArrayOfObjs.Contains(efObj)
),该怎么办
我找到了解决办法!将您的efObj
转换为字符串
,每个字段之间用分隔(您几乎可以将其视为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();
var reqAssetsDataStringRep=new List();
foreach(onDemandQueueJobRequest.RequestedAssets中的变量ra)
{
ReqAssetDataStringRep.Add(ra.RequestedAssetId+“”+ra.ImageId);
}
var requestedAssets=await(来自DbContext.requestedAssets中的reqAsset
在DbContext中连接图像。reqAsset.ImageId上的图像等于image.Id
其中ReqAssetDataStringRep.Contains(reqAsset.Id+“\u”+image.Id)
选择reqAsset
).ToListAsync();
通过将for
循环更改为IEnumerable list=Enumerable.Range(1,10),您可以对其进行大量清理代码>获取的点+1但公平地说,我只是在编写代码,我知道不需要测试就可以工作:)我得到了错误:int[]不包含contains的定义。
。可能是因为System.Linq不包括在内?它不应该使用x吗。与要搜索的数据类型(在本例中为整数)匹配的。比如db.sometable.where(x=>new[]{1,2}.Contains(x.Id));
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
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();