C# 需要帮助在数据库查询中构建Where()子句吗
为LINQ查询生成C# 需要帮助在数据库查询中构建Where()子句吗,c#,linq,C#,Linq,为LINQ查询生成.Where()子句时遇到问题 我需要从数据库返回cultureName参数和IsActive=true的regionresources列表。如果IsActive=false,则返回匹配的Id的defaultCultureName 这些是实体(为简洁起见,不包括不相关的属性): 一些数据示例: 1: RegionResources { Id = 1, CultureId = 1, IsActive = true, Name = "Name(en-US)" } 2: Region
.Where()
子句时遇到问题
我需要从数据库返回cultureName
参数和IsActive=true
的regionresources
列表。如果IsActive=false
,则返回匹配的Id
的defaultCultureName
这些是实体(为简洁起见,不包括不相关的属性):
一些数据示例:
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)" }
注意:应该返回记录(3),而不是记录(4),因为即使cultureName=he IL,IsActive=false(非真)
.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);
}
公共IPagedList GetRegionResources(
字符串cultureName,
字符串defaultCultureName,
整版,
内部页面大小)
{
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);
返回query.ToPagedList(页面,页面大小);
}
对于那些在最初的帖子中投入时间并尝试帮助的人,我很抱歉。谢谢
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)" }
实际需要的是在区域性处于非活动状态时设置默认区域性。这可以通过选择来完成。您只想将其设置为非活动项,以便它需要是该区域性的联合项或活动项和非活动项
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();
List cult=new List();
var c1=new Culture(){Id=1,CultureName=“en-US”};
var c2=new Culture(){Id=2,CultureName=“he-IL”};
添加(c1);
新增(c2);
List rr=新列表();
Add(newregionresources(){Id=1,Culture=c1,IsActive=true,Name=“Name(en-US)”});
Add(newregionresources(){Id=1,Culture=c2,IsActive=true,Name=“Name(he-IL)”});
Add(newregionresources(){Id=2,Culture=c1,IsActive=true,Name=“Name_2(en-US)”});
Add(newregionresources(){Id=2,Culture=c2,IsActive=false,Name=“Name_2(he-IL)”});
字符串cultureName=“he-IL”;
var=c1;
列表结果=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();
是的,你是对的。我没有准确解释:我需要查询结果返回记录2&3@Ronnie您需要另一个条件来筛选记录1。是的,我只是不知道如何包括该条件。。。你能帮我处理附加的条件语句吗?@Ronnie你可以添加另一个这样的条件:var query=context.RegionResources.Where(r=>(r.Culture.CultureName==CultureName&&r.IsActive)| |(r.Culture.CultureName==defaultCultureName&&r.Name!=“Name(en-US)”).ToList();无法指定r.Name。两种文化(en-US和he-IL)都有许多具有不同名称值的RegionResource记录。我在这篇文章中只添加了4个例子。我在想,如果您首先通过一个查询找到区域Id,然后通过regionId运行现有的查询筛选,那么可能会指定“r.Id Count=1”,代码中的任何区域性名称检查都会更容易理解,并且可能会执行您想要的操作。稍后您可以尝试将其合并到单个查询中(可能有一些内部联接)。我需要一个使用regionId的Skip().Take()的pagedList,但对于指定的处于活动状态的cultureName,如果它不处于活动状态,则获取始终处于活动状态的defaultCultureName。您是否自己创建了扩展方法ToPagedList?是的,我需要此API的可自定义寻呼机,但它几乎使用标准的Skip().Take()。在UI方面,我的一个MVC项目使用X.PagedList.MVC.Core,其中属性映射几乎相同。我将它们添加为实体,以明确我需要从数据库中获得什么。但也许在使用Union()时会出现一些问题。我只需要一个从DB到union的初始列表。不管是否在DB上,请在代码中使用linq。我只将此用作测试,并让其他人运行某些内容。我将尝试使用它。在尝试中,我设置了rr=context.RegionResources(),但没有成功,因为它返回整个表。查询中还有Skip.Take和OrderBy。我忽略了它,只想Where()需要重写。编辑了问题并添加了实际的方法。谢谢你的帮助,奥尔德特。
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();