Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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
C# linq查询,其中包含类的列表_C#_Linq - Fatal编程技术网

C# linq查询,其中包含类的列表

C# linq查询,其中包含类的列表,c#,linq,C#,Linq,我有一张桌子: tblFildsVal -idbigint -listIdbigint -listFieldValuebigint -parrentIdbigint 然后我有一个数组(或列表),表示4个匹配条件: myArr -listId//参考listId -rangeType//它有4个变量:1)精确的2)上3)下4)介于 -来自//较低的值 -至//上限值 多个匹配条件可以链接在一起,这样它就可以对tblFildsVal中的任何记录执行与任何给定条件集的匹配 例如: myArr{{1,1

我有一张桌子:

tblFildsVal
-idbigint
-listIdbigint
-listFieldValuebigint
-parrentIdbigint

然后我有一个数组(或列表),表示4个匹配条件:

myArr
-listId//参考listId
-rangeType//它有4个变量:1)精确的2)上3)下4)介于
-来自//较低的值
-//上限值

多个匹配条件可以链接在一起,这样它就可以对tblFildsVal中的任何记录执行与任何给定条件集的匹配

例如:

myArr{{1,1,100,Null},{2,2,125,Null},{3,3,Null,175},{4,4,125,175}}  
这意味着我想知道每一条记录(由parrentId分组),其中有:

(1)listId == 1 && listFieldValue == 100  
(2)listId == 2 && listFieldValue > 125  
(3)listId == 3 && listFieldValue < 175  
(4)listId == 4 && (listFieldValue > 125 && listFieldValue < 175)

但我不知道这件事

您的问题是需要实现匹配逻辑。简单的All或Contains调用将不满足数组提供的匹配规则。我在下面实现了一个示例解决方案,它将展示如何编写查询来检查匹配逻辑

类程序
{
静态void Main(字符串[]参数)
{
var myMatchConditions=new int?[]
{ 
新的int?[{1,1100,null},
新的int?[{2,2,125,null},
新的int?[{3,3,null,175},
新整数?[{4,4,125,175}
};
var myData=新的MyTableItem[]
{
新的MyTableItem{id=1,listId=1,listFieldValue=150,parentId=1},
新的MyTableItem{id=2,listId=1,listFieldValue=75,parentId=1},
新的MyTableItem{id=3,listId=2,listFieldValue=150,parentId=1},
新的MyTableItem{id=4,listId=4,listFieldValue=150,parentId=1},
新的MyTableItem{id=5,listId=5,listFieldValue=150,parentId=1},
};
var matches=来自myData中的d
其中myMatchConditions.Any(cond=>(
(cond[0]==d.listId)和
(cond[1]==1?d.listFieldValue==cond[2]:
(cond[1]==2?d.listFieldValue>cond[2]:
(cond[1]==3?d.listFieldValuecond[2]&&d.listFieldValue
需要注意的重要事项是对数组进行逻辑检查。在这里,我通过一个Any调用和一些嵌套的三元运算符完成了它,这不是我推荐的最终解决方案

如果您可以显式地为匹配条件创建一个类,然后使用类似于
boolmatchesme(…)
的方法来检查每个字段,那么匹配的逻辑可以从LINQ语句中直观地分离出来,那么它可以变得更清晰

注意:要绕过使用实体框架的限制,您可能需要将匹配条件填充到数据库中的表中,这样您就可以在匹配逻辑中将记录用作对象;或者,更简单的是,您可以将数据库表中的结果作为IEnumerable返回,然后执行与我的示例中相同的匹配逻辑

我建议您创建一个
listId
参数列表,这样您就可以只提取需要根据范围条件进行验证的数据库记录。例如,假设您使用
myMatchConditions
中的
listId
值设置了一个
列表myListIdFilters
。然后,您只需更改逻辑检查的第一行:

var matches=来自myData.Where中的d(myDataItem=>MyListDfilters.Contains(myDataItem.listId)).AsEnumerable()

其余的将保持不变。
AsEnumerable
调用将导致解析
IQueryable
对象,因此剩余的逻辑将在EF(或LINQ to SQL)上下文之外执行。

您的问题是什么?我无法编写查询来获取tblFildsVal中满足myArr的字段,请检查“这意味着我想知道:”…@MarcinJuraszek Thankso您的数组指定了匹配条件,您正在对照表的记录检查这些条件?你在寻找任何符合给定条件的记录吗?@Mike Guthrie是的,在示例中我解释了更多。让我检查一下,谢谢你的回复。如果他使用EF,然后,我认为这样提取方法会导致一个异常…+1,甚至试图将此问题解释为writtenerror:LINQ to Entities中不支持LINQ表达式节点类型ArrayIndex。@Colin DeClue是的,我正在使用EF,知道吗?
var q = from flds in tblFildsVal  
        group flds by flds.parrentId into gFields  
        where myArr.All(i => gFields.Select(co => co.listFieldValue).Contains(i))