C# 需要帮助在数据库查询中构建Where()子句吗

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

为LINQ查询生成
.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();