我有一个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_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();
正如您所看到的,我可以将变量IsWet传递给LINQ查询以获得标准列表,并获取第一个列表的值。但是当我为第二个列表执行相同的操作时,我收到以下错误
'where'条件无效。实体成员正在调用无效的属性或方法
答案 0 :(得分:3)
CRM LINQ提供程序不支持您尝试的评估。它仅支持评估where
标准正在评估实体字段。
这不是问题。因为如果IsWet
为假,你希望LINQ查询只使用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();
答案 1 :(得分:2)
我经常面对这个问题。
尝试从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
标志来控制条件块(从代码中的一点启用和禁用它们),那么您可能对名为PredicateBuilder的类感兴趣,它允许您动态构造谓词。
答案 2 :(得分:-1)
仅仅因为我有一个包含许多其他连接的现有查询等,并且我想将此附加参数传递给它,我最终使用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();