Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linq与SQL IN运算符的等效值是什么_Sql_Linq_Contains - Fatal编程技术网

linq与SQL IN运算符的等效值是什么

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)

使用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);
}

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();