Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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查询表达式成为动态的_Linq - Fatal编程技术网

如何使LINQ查询表达式成为动态的

如何使LINQ查询表达式成为动态的,linq,Linq,我尝试使用以下LINQ查询表达式实现级联控件 我的想法是,我有三个选项列表,分别由OptionA、OptionB和OptionC表表示,还有一个名为OptionIndex的视图,其中OptionA_ID、OptionB_ID、OptionC_ID各有一列,该表包含使用中的选项列表中的所有标记组合。左外连接选项列表上的OptionIndex会为选项标记中的已禁用属性生成布尔值 如何使on子句(以下示例代码中的.Where(…)允许使用任何控件组合) 例如,假设用户最初选择OptionA中的选项值1

我尝试使用以下LINQ查询表达式实现级联控件

我的想法是,我有三个选项列表,分别由OptionA、OptionB和OptionC表表示,还有一个名为OptionIndex的视图,其中OptionA_ID、OptionB_ID、OptionC_ID各有一列,该表包含使用中的选项列表中的所有标记组合。左外连接选项列表上的OptionIndex会为选项标记中的已禁用属性生成布尔值

如何使on子句(以下示例代码中的.Where(…)允许使用任何控件组合)

例如,假设用户最初选择OptionA中的选项值123。返回OptionC的值、标签和禁用布尔值的代码如下所示:

from t1 in OptionCs
from t2 in OptionIndexes.Where(x => t1.OptionC_ID == x.OptionC_ID && new List<int> { 123 }.Contains(x.OptionA_ID)).DefaultIfEmpty()
group new {t1, t2} by new { t1.OptionC_ID, t1.Label } into g
select new { g.Key.OptionC_ID, g.Key.Label, Disabled = g.Count(t => t.t2.OptionC_ID == null) > 0 }
处理这个问题的最佳方法是什么


谢谢
List<int> l = new List<int> { 1, 25, 3, 99, -23, 0, 15, 75 };
List l=新列表{1,25,3,99,-23,0,15,75};
假设您希望根据外部条件有条件地筛选此列表。有时候你想要正数,有时候你想要小于50的数,有时候你想要被5整除的数,或者这些的任意组合。使用静态表达式应用所有筛选器将如下所示:

l.Where(n => n > 0).Where(n => n < 50).Where(n => n % 5 == 0);
l.Where(n=>n>0)。Where(n=>n<50)。Where(n=>n%5==0);
要动态应用任何或所有这些,只需分块构建LINQ查询:

// These switches simulate your external conditions.
bool conditionA = true;
bool conditionB = false;
bool conditionC = true;

IEnumerable<int> myList = l;
if (conditionA) { myList = myList.Where(n => n > 0     ); }
if (conditionB) { myList = myList.Where(n => n < 50    ); }
if (conditionC) { myList = myList.Where(n => n % 5 == 0); }
//这些开关模拟您的外部条件。
布尔条件a=真;
bool条件b=假;
bool条件c=真;
IEnumerable myList=l;
如果(条件a){myList=myList.Where(n=>n>0);}
如果(条件B){myList=myList.Where(n=>n<50);}
如果(条件C){myList=myList.Where(n=>n%5==0);}
在我的示例中设置开关后,输出为25、15、75


旁注:如果你没有意识到这一点,用它来做类似的实验。无论是否是LINQ代码,它都是以交互方式执行代码的绝佳工具。在构建上述示例时,我插入了
myList.Dump()在最后4行中的每一行之后调用,这样我就可以看到每个过滤器是如何应用的。以下是输出:


谢谢你的回答。我们就是这样做的。而且,我确实使用了LINQPad。
l.Where(n => n > 0).Where(n => n < 50).Where(n => n % 5 == 0);
// These switches simulate your external conditions.
bool conditionA = true;
bool conditionB = false;
bool conditionC = true;

IEnumerable<int> myList = l;
if (conditionA) { myList = myList.Where(n => n > 0     ); }
if (conditionB) { myList = myList.Where(n => n < 50    ); }
if (conditionC) { myList = myList.Where(n => n % 5 == 0); }