林克:添加额外';其中';子句给出随机结果

本文关键字:随机 结果 子句 其中 添加 林克 | 更新日期: 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);