林克:添加额外';其中';子句给出随机结果
本文关键字:随机 结果 子句 其中 添加 林克 | 更新日期: 2023-09-27 18:26:06
我是使用Linq的初学者,现在很多内容都很混乱。
我从下载并使用了LinqFlickr库http://linqflickr.codeplex.com.不过,我想这只是我对林克缺乏了解。没有太多关于LinqFlickr项目的文档可供我继续
如果我运行以下代码,如果用户名字符串为空,它运行良好,并返回带有特定标记的照片。但如果里面有用户名,它应该按照特定用户细化之前的结果,相反,它会给我一堆随机的照片。
var photos = (from ph in context.Photos
where
ph.SearchMode == SearchMode.TagsOnly
&& ph.SearchText == tag
&& ph.PhotoSize == PhotoSize.Small
&& ph.Extras == (ExtrasOption.Owner_Name | ExtrasOption.Date_Taken)
select ph);
if (username != "")
{
string personId = (from people in context.Peoples
where
people.Username == username
select people.Id).First();
photos = photos.Where(q => q.NsId == personId) ;
}
photos = photos.Take(10);
我试着使用一些调试工具,如LinqPad和MetaLinq,但一直无法使用它们解决问题。
此外,我相信我的Linq查询可以在一个查询中进行,这将是非常棒的,但请解释一下,让Linq新手能够理解!
您的查询看起来不错。我的猜测是,这是Athena中的一个错误(或设计行为不直观),其中一个额外的"链式"where
子句导致原始where
子句被遗忘。
独立地组装第二个查询(即一个大where
子句中的所有约束),并检查这是否修复了问题。如果真是这样,那肯定是API中的一个bug。您可以通过使用LINQKit动态组装和扩展where
子句的谓词来解决此问题。这可能是什么样子:
// Original predicate without userId constraint
Expression<Func<Photo, bool>> predicate = ph =>
ph.SearchMode == SearchMode.TagsOnly
&& ph.SearchText == tag
&& ph.PhotoSize == PhotoSize.Small
&& ph.Extras == (ExtrasOption.Owner_Name | ExtrasOption.Date_Taken);
if (!string.IsNullOrEmpty(username))
{
// Build the userId constraint into the predicate.
var personId = (from people in context.Peoples
where people.Username == username
select people.Id).First();
// "And" combines the predicates
// "Expand" removes the use of invocation expressions, which
// some LINQ providers have problems with.
predicate = predicate.And(q => q.NsId == personId).Expand();
}
// Final result
var photos = context.Photos.Where(predicate).Take(10);