我在为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 回答
当文化是InActive时,你真正想要的是 set 默认文化 . 这可以通过选择来完成 . 您只想将其设置为非活动状态,因此它需要是该文化的联合或活动和非活动项目 .
应该回来