如何将外部参数传递给CRM中的LINQ where子句
我有一个LINQ查询,它可以很好地用于独立列表,但无法用于CRM如何将外部参数传递给CRM中的LINQ where子句,linq,dynamics-crm-2011,Linq,Dynamics Crm 2011,我有一个LINQ查询,它可以很好地用于独立列表,但无法用于CRM var lst = new List<bool?>(); lst.Add(null); lst.Add(true); lst.Add(false); bool IsWet = false; var newlst = from exch_HideVoiceSignature in lst where (((exch_HideVoiceSignature!=null && exch_HideVoi
var lst = new List<bool?>();
lst.Add(null);
lst.Add(true);
lst.Add(false);
bool IsWet = false;
var newlst = from exch_HideVoiceSignature in lst where
(((exch_HideVoiceSignature!=null && exch_HideVoiceSignature==false
|| exch_HideVoiceSignature== null) )&& !IsWet) select exch_HideVoiceSignature;
newlst.Dump();
var question = from q in exch_questionSet where ((q.exch_HideVoiceSignature != null
&& q.exch_HideVoiceSignature.Value == 0 )|| q.exch_HideVoiceSignature == null )
&& !IsWet select q.exch_HideVoiceSignature;
question.FirstOrDefault().Dump();
var lst=newlist();
lst.Add(空);
lst.Add(真);
1.添加(假);
bool IsWet=false;
var newlst=来自lst中的exch_HideVoiceSignature,其中
(((exch_HideVoiceSignature!=null&&exch_HideVoiceSignature==false
||exch_HideVoiceSignature==null))&&!IsWet)选择exch_HideVoiceSignature;
newlst.Dump();
var question=来自exch_questionSet中的q,其中((q.exch_HideVoiceSignature!=null
&&q.exch_HideVoiceSignature.Value==0)| | q.exch_HideVoiceSignature==null)
&& !IsWet选择q.exch\U隐藏签名;
问题.FirstOrDefault().Dump();
如您所见,我可以将变量IsWet传递给LINQ查询以获得标准列表fine,并获取第一个列表的值。但当我对第二个列表执行相同的操作时,我得到了以下错误
无效的“where”条件。实体成员正在调用无效的属性或方法我经常遇到这个问题 尝试从CRM中“分离”(例如调用.ToArray())您的查询(当它处于“清除”状态时),然后使用外部参数筛选查询。这应该会有所帮助
var question =
(from q in exch_questionSet
where (
(q.exch_HideVoiceSignature != null && q.exch_HideVoiceSignature.Value == 0 ) ||
q.exch_HideVoiceSignature == null )
select q.exch_HideVoiceSignature
).ToArray().Where(q => !IsWet);
question.FirstOrDefault().Dump();
使现代化
如果您使用
IsWet
标志来控制条件块(从代码中的一个点启用和禁用它们),那么您可能对名为的类感兴趣,该类允许您动态构造谓词。我经常遇到这个问题
尝试从CRM中“分离”(例如调用.ToArray())您的查询(当它处于“清除”状态时),然后使用外部参数筛选查询。这应该会有所帮助
var question =
(from q in exch_questionSet
where (
(q.exch_HideVoiceSignature != null && q.exch_HideVoiceSignature.Value == 0 ) ||
q.exch_HideVoiceSignature == null )
select q.exch_HideVoiceSignature
).ToArray().Where(q => !IsWet);
question.FirstOrDefault().Dump();
使现代化
如果您使用
IsWet
标志来控制条件块(从代码中的一个点启用和禁用它们),那么您可能会对名为的类感兴趣,该类允许您动态构造谓词。CRM LINQ提供程序不支持您尝试的评估。它仅支持在标准正在评估实体字段的情况下评估
这不是问题。由于您希望LINQ查询仅在IsWet
为false时使用where子句(如果我在这一点上有错误,请更正我),因此我们只需进行计算,以确定是否应添加where
子句。然后执行查询
var question = from q in exch_questionSet
select q.exch_HideVoiceSignature;
if (!IsWet)
{
question.Where(x => ((x.exch_HideVoiceSignature != null
&& x.exch_HideVoiceSignature.Value == 0) || x.exch_HideVoiceSignature == null));
}
question.FirstOrDefault().Dump();
CRM LINQ提供程序不支持您尝试的评估。它仅支持在
标准正在评估实体字段的情况下评估
这不是问题。由于您希望LINQ查询仅在IsWet
为false时使用where子句(如果我在这一点上有错误,请更正我),因此我们只需进行计算,以确定是否应添加where
子句。然后执行查询
var question = from q in exch_questionSet
select q.exch_HideVoiceSignature;
if (!IsWet)
{
question.Where(x => ((x.exch_HideVoiceSignature != null
&& x.exch_HideVoiceSignature.Value == 0) || x.exch_HideVoiceSignature == null));
}
question.FirstOrDefault().Dump();
只是因为我有一个包含许多其他连接等的现有查询,并且我想将这个附加参数传递给它,所以我最终使用了一个var语句,该语句将行转储到一个列表中,并在同一语句中应用where子句
bool IsWet =true ;
var question = ...existing query ...
select new {
...existing output ...,
Wet =q.exch_HideVoiceSignature != null &&
q.exch_HideVoiceSignature.Value == 119080001,
Voice = q.exch_HideVoiceSignature == null ||
(q.exch_HideVoiceSignature != null &&
q.exch_HideVoiceSignature.Value == 119080000) ,
}
;
var qq = IsWet ?
question.ToList().Where(X=> X.Wet ) :
question.ToList().Where(X=> X.Voice );
qq.FirstOrDefault().Dump();
只是因为我有一个包含许多其他连接等的现有查询,并且我想将这个附加参数传递给它,所以我最终使用了一个var语句,该语句将行转储到一个列表中,并在同一语句中应用where子句
bool IsWet =true ;
var question = ...existing query ...
select new {
...existing output ...,
Wet =q.exch_HideVoiceSignature != null &&
q.exch_HideVoiceSignature.Value == 119080001,
Voice = q.exch_HideVoiceSignature == null ||
(q.exch_HideVoiceSignature != null &&
q.exch_HideVoiceSignature.Value == 119080000) ,
}
;
var qq = IsWet ?
question.ToList().Where(X=> X.Wet ) :
question.ToList().Where(X=> X.Voice );
qq.FirstOrDefault().Dump();
@Bvrce您完全正确-这是主要问题,例如,如果我在where子句中只有一个条件,并且这个条件与外部参数相关。在这种情况下,我被迫将所有记录从CRM转储到阵列,然后过滤它们。或者简单地通过调用每个元素的API来循环外部数据。谢谢Andrey。我还可以通过附加到ToList来使用.where语句吗?还有一个问题是,我不想从服务器下载额外的行,因为目标是通过添加IsWet标志来提高性能。非常感谢您的想法。ToList也适用于本地转储数据的任何其他方法。FetchXML查询可能更适合,因为您可以将IsWet标志直接嵌入到筛选条件中。@Bvrce您完全正确-这是一个主要问题,例如,如果我在where子句和此条件中只有一个条件与外部参数相关。在这种情况下,我被迫将所有记录从CRM转储到阵列,然后过滤它们。或者简单地通过调用每个元素的API来循环外部数据。谢谢Andrey。我还可以通过附加到ToList来使用.where语句吗?还有一个问题是,我不想从服务器下载额外的行,因为目标是通过添加IsWet标志来提高性能。非常感谢您的想法。ToList也适用于本地转储数据的任何其他方法FetchXML查询可能更适合,因为您可以将IsWet标志直接嵌入到筛选条件中。请记住,这仅适用于和筛选:非常感谢您的回答。这似乎指向了正确的方向,但问题是where条款是否可以添加到现有的20个其他where条件中?换句话说,这是一个非常复杂的语句的一部分,包含许多其他连接和where子句。我可以将条件where子句添加到现有查询中吗。@SofiaKhwaja-可以,您可以将其添加到现有的where
子句中。我们只能根据您提供的代码工作,而不是使用20个其他条件的理论查询(具体取决于如何设置)。正如@Daryl正确指出的,它只适用于&&
——基于您提供的特定代码,这正是您想要的。现在,根据您正在构造的where
子句的复杂程度,您可以绕过&&
限制,但这需要一些工作。当我尝试这种方法时,我会收到错误消息“method'where'无法跟随method'Select'或不支持”Step back,如果从原始查询doe中删除IsWet
条件