首页 文章

需要帮助在对数据库的查询中构建Where()子句

提问于
浏览
-1

我在为LINQ查询构建 .Where() 子句时遇到问题 .

我需要从数据库中为 cultureName 参数和 IsActive = true 返回 RegionsResources 的列表 . 如果 IsActive = false ,则返回 defaultCultureName 以匹配 Id .

这些是实体(为简洁起见,不包括不相关的属性):

public class RegionResources
{
    // FYI: Composite-Key (Id, CultureId)
    public int Id { get; set; }
    public int CultureId { get; set; }
    public bool IsActive { get; set; }
    public string Name { get; set; }
    public virtual Culture Culture { get; set; }
}

public class Culture
{
    public int Id { get; set; }
    public string CultureName { get; set; }
}

一些数据示例:

1: RegionResources { Id = 1, CultureId = 1, IsActive = true, Name = "Name(en-US)" }
2: RegionResources { Id = 1, CultureId = 2, IsActive = true, Name = "Name(he-IL)" }
3: RegionResources { Id = 2, CultureId = 1, IsActive = true, Name = "Name_2(en-US)" }
4: RegionResources { Id = 2, CultureId = 2, IsActive = FALSE, Name = "Name_2(he-IL)" }
--
1: Culture { Id = 1, CultureName = "en-US" }
2: Culture { Id = 2, CultureName = "he-IL" }

这是使用几个.Where()子句不能按需工作的方法:

public class GetRegionResources(string cultureName = "he-IL",
                                string defaultCultureName = "en-US")
{
    var query = context.RegionResources

    // This Where() uses '||' and returns ALL that are IsActive=true
    // for both cultureNames
    .Where(r => (r.Culture.CultureName == cultureName && r.IsActive) ||
                r.Culture.CultureName == defaultCultureName)
    // OR
    // This Where() uses '&&' and returns NOTHING (0 records)
    .Where(r => (r.Culture.CultureName == cultureName && r.IsActive) &&
                r.Culture.CultureName == defaultCultureName)
    .ToList();

    return query;
}

请求:

GetReionResources("he-IL", "en-US");

应该返回以下内容:

2: RegionResources { Id = 1, CultureId = 2, IsActive = true, Name = "Name(he-IL)" }
3: RegionResources { Id = 2, CultureId = 1, IsActive = true, Name = "Name_2(en-US)" }

注意:应返回Record(3)而不记录(4)因为即使cultureName = he-IL,IsActive = false(不是true) .

应该如何编写.Where()子句?或者,如果不应该使用.Where(),那么正确的查询是什么?

谢谢 .

对方法的修改:我没有复制初始方法,而是用名义上的细节重新输入它,认为只需要重写Where() . 我也意识到我把它变成了一个类而不是一个方法 . 这是实际的方法 .

public IPagedList<RegionResources> GetRegionResources(
    string cultureName,
    string defaultCultureName,
    int page,
    int pageSize)
{
    var query = context.RegionResources
        .Where(r => r.Culture.CultureName == cultureName && r.IsActive ||
                    r.Culture.CultureName == defaultCultureName);
    query = query.OrderBy(r => r.Name);
    query = query.Include(r => r.Culture);
    return query.ToPagedList(page, pageSize);
}

对于那些花时间并根据初始帖子尝试帮助的人抱歉 . 谢谢 .

2 回答

  • 0

    当文化是InActive时,你真正想要的是 set 默认文化 . 这可以通过选择来完成 . 您只想将其设置为非活动状态,因此它需要是该文化的联合或活动和非活动项目 .

    List<Culture> cult = new List<Culture>();
                var c1 = new Culture() { Id = 1, CultureName = "en-US" };
                var c2 = new Culture() { Id = 2, CultureName = "he-IL" };
                cult.Add(c1);
                cult.Add(c2);
    
                List<RegionResources> rr = new List<RegionResources>();
                rr.Add(new RegionResources() { Id = 1, Culture = c1, IsActive = true, Name = "Name(en-US)" });
                rr.Add(new RegionResources() { Id = 1, Culture = c2, IsActive = true, Name = "Name(he-IL)" });
                rr.Add(new RegionResources() { Id = 2, Culture = c1, IsActive = true, Name = "Name_2(en-US)" });
                rr.Add(new RegionResources() { Id = 2, Culture = c2, IsActive = false, Name = "Name_2(he-IL)" });
    
                string cultureName = "he-IL";
                var defaultCulture = c1;
    
                List<RegionResources> result = rr.Where(r => r.Culture.CultureName == cultureName && r.IsActive == true)
                    .Union(rr.Where(r => r.Culture.CultureName == cultureName && r.IsActive == false)).Select(x => { x.Culture = defaultCulture; return x; }).ToList();
    
  • 0
    var query = context.RegionResources
            .Where(r => (r.Culture.CultureName == cultureName && r.IsActive) ||
                             (r.Culture.CultureName == defaultCultureName && r.Name != "Name(en-US)"))
            .ToList();
    

    应该回来

    2: RegionResources { Id = 1, CultureId = 2, IsActive = true, Name = "Name(he-IL)" }
    3: RegionResources { Id = 2, CultureId = 1, IsActive = true, Name = "Name_2(en-US)" }
    

相关问题