实体& Linq没有正确过滤

时间:2017-03-18 17:27:09

标签: c# entity-framework linq entity-framework-6

我有3张桌子

  1. BaseNews
  2. EN_NewsDetails(来自BaseNews表的外键)
  3. HI_NewsDetails(来自BaseNews表的外键)
  4. 在我的代码中,当我选择任何语言时,它只需要检索该语言的详细信息。但是在这里它返回所有EN& HI语言细节也。

      

    在这里,当我选择我的语言作为EN,但我收到了返回EN和& HI语言细节

    代码

    public List<BaseNews> GetAllNewsDetailsByLang(string lang)
    {
        List<BaseNews> prd = new List<BaseNews>();
    
        if (lang.Trim() == "EN")
        {
            prd = (from c in context.BaseNews
                    join x in context.EN_NewsDetails
                    on c.Nid equals x.enId
                    where c.IsActive == true
                    select c).ToList();
        }
        else if (lang.Trim() == "HI")
        {
            prd = (from k in context.BaseNews
                    join x in context.HI_NewsDetails
                    on k.Nid equals x.enId
                    where k.IsActive == true
                    select k).ToList();
        }
    
        return prd;
    }
    

    解释

    public partial class BaseNews
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public BaseNews()
        {
            this.EN_NewsDetails = new HashSet<EN_NewsDetails>();
            this.HI_NewsDetails = new HashSet<HI_NewsDetails>();
        }
    
        public int Nid { get; set; }
        public int Category_CategoryId { get; set; }
        public string ThumbImagePath { get; set; }
        public string OriginalImagePath { get; set; }
        public string ModifiedBy { get; set; }
        public Nullable<bool> IsActive { get; set; }
    }
    
    public partial class EN_NewsDetails
    {
        public int NDetailsId { get; set; }
        public int enId { get; set; }
        public string Subject { get; set; }
        public string Summary { get; set; }
        public string Details { get; set; }
    
        public virtual BaseNews BaseNews { get; set; }
    }
    
    public partial class HI_NewsDetails
    {
        public int NDetailsId { get; set; }
        public int enId { get; set; }
        public string Subject { get; set; }
        public string Summary { get; set; }
        public string Details { get; set; }
    
        public virtual BaseNews BaseNews { get; set; }
    }
    

2 个答案:

答案 0 :(得分:0)

我会尝试这样的事情:

public List<BaseNews> GetAllNewsDetailsByLang(string lang)
{
    var newsDetails = new List<BaseNews>();

    if (lang.Trim() == "EN")
    {
        newsDetails = context.EN_NewsDetails
                             .Include(en_nd=>en_nd.BaseNews)
                             .Where(en_nd=>en_nd.BaseNews.IsActive.HasValue 
                                        && en_nd.BaseNews.IsActive)
                             .Select(en_nd=>en_nd.BaseNews)
                             .ToList();
    else if (lang.Trim() == "HI")
    {
        newsDetails = context.HI_NewsDetails
                             .Include(hi_nd=>hi_nd.BaseNews)
                             .Where(hi_nd=>hi_nd.BaseNews.IsActive.HasValue  
                                        && hi_nd.BaseNews.IsActive)
                             .Select(hi_nd=>hi_nd.BaseNews)
                             .ToList();
    }

    return newsDetails;
}

备注

尽管上述代码可能会修复您的过滤问题,但我认为您应该更清楚地了解一些观点。

  • 如果语言不是&#34; EN&#34;也不是&#34; HI&#34;,你只想返回一个空列表。那是对的吗?实际上代码在这种情况下确实如此,我不确定你是否想要这个。
  • 当您返回BaseNews对象时,您正在谈论语言详细信息。我不认为这是一致的,至少在概念层面是这样。

关于第二个项目,请尝试阅读上述方法,您将明白我的意思。它的名字是GetAllNewDetailsByLang。没关系。跳过方法的第一行,我们返回BaseNews个对象的列表。为了修复这个问题,我创建了一个误导。但无论方法的目的或其他代码或其他什么,以下行:

var newsDetails = new List<BaseNews>();

尚不清楚。它不是因为你不清楚你想要归还什么这一事实。说清楚,我们可以更改namigs并修复上述项目符号。

答案 1 :(得分:0)

我们没有看到您对上述结果所做的事情,但我也看到上下文没有被处理掉。因此,如果您从BaseNews访问该导航属性并且启用了延迟加载(默认情况下),EF将自动为您获取该数据。您可以通过执行

关闭特定上下文的延迟加载
context.Configuration.LazyLoadingEnabled = false;