簡體   English   中英

ASP.NET MVC5實體框架6 get bool = true和bool = false LINQ

[英]ASP.NET MVC5 Entity Framework 6 get bool = true and bool = false LINQ

我有一個要過濾的表。 對於值“ include”有一個過濾器,該過濾器可以為true或false。

我有一個具有3個選項的過濾器: truefalseall

因此,當過濾器為true時,它應該返回其中include ='true';的行。 當過濾器為“ false”時,返回where include = false; 當“全部”返回時,其中include = true或false。

這是我的代碼,不起作用,但我認為應該如此。

private ICollection<AggregationEntityViewModel> getEntities(AggregationPracticeDetailsViewModel apdvm)
{
    bool? filterInclude = Convert.ToBoolean(apdvm.Filter_IncludeValue);

    var a = (from e in _repository.GetAll<Entity>()                         
        where e.include == filterInclude != null ? (bool)filterInclude : (true || false)                     
        select e
     return a;
}

當前,當filter設置為'All'或'False'時,它返回0行,而當設置為'Yes'時,返回所有行。

僅供參考,為清晰起見,我省略了很多代碼。

請幫助...謝謝!

*編輯:我已經顯示了所有代碼,因此您可以看到為什么我要將所有內容保留在linq查詢中。 感謝所有提供的解決方案。 我看到大多數解決方案都涉及使用Linq Extension方法。 無論如何,在嵌入式linq查詢中可以做到這一點? *

bool? filterInclude = Convert.ToBoolean(apdvm.Filter_IncludeValue);
            var a = (from e in _repository.GetAll<Entity>()
                     from u in e.Users
                     where (e.AuditQuestionGroupId != null ? e.AuditQuestionGroupId : 0) == this.LoggedInEntity.AuditQuestionGroupId
                     && e.BatchNumber != null && e.BatchNumber.StartsWith(apdvm.Filter_BatchNumber == null ? "" : apdvm.Filter_BatchNumber)
                     && e.Name != null && e.Name.ToLower().StartsWith(apdvm.Filter_EntityName.ToLower())
                     && e.EntityState != null && e.EntityState.ToLower().Contains(apdvm.Filter_StateValue == null ? "" : apdvm.Filter_StateValue.ToLower())
                     && u.NIAMembershipId != null && u.NIAMembershipId.Contains(apdvm.Filter_MemberNo == null ? "" : apdvm.Filter_MemberNo)
                     from p in e.PracticeProfiles.DefaultIfEmpty()
                     join ea in _repository.GetAll<EntityAggregate>() on e.EntityId equals ea.EntityId into eas
                     from ea in eas.DefaultIfEmpty()                     
                     where ea.include == filterInclude != null ? (bool)filterInclude : (true || false)
                     group e by new { entity = e, profile = p, ea = ea } into newGroup
                     orderby newGroup.Key.entity.Name
                     select new AggregationEntityViewModel()
                     {
                         Id = newGroup.Key.ea == null ? 0 : newGroup.Key.ea.Id,
                         EntityId = newGroup.Key.entity.EntityId,
                         Include = newGroup.Key.ea == null ? (true || false) : (bool)newGroup.Key.ea.include,
                         BHAddress = newGroup.Key.profile == null || newGroup.Key.profile.soloOffice == null ? false : (bool)newGroup.Key.profile.soloOffice,
                         Incorporated = newGroup.Key.profile == null || newGroup.Key.profile.company == null ? false : (bool)newGroup.Key.profile.company,
                         MajorityOwned = newGroup.Key.profile == null || newGroup.Key.profile.capital == null ? false : (bool)newGroup.Key.profile.capital,
                         MajorityVoting = newGroup.Key.profile == null || newGroup.Key.profile.votingRights == null ? false : (bool)newGroup.Key.profile.votingRights,
                         Name = newGroup.Key.entity.Name,
                         Partnership = newGroup.Key.profile == null || newGroup.Key.profile.partnership == null ? false : (bool)newGroup.Key.profile.partnership,
                         PublicAccountant = newGroup.Key.profile == null || newGroup.Key.profile.publicAccountant == null ? false : (bool)newGroup.Key.profile.publicAccountant,
                         Trust = newGroup.Key.profile == null || newGroup.Key.profile.operatingTrust == null ? false : (bool)newGroup.Key.profile.operatingTrust,
                         TrustDeed = newGroup.Key.profile == null || newGroup.Key.profile.deed == null ? false : (bool)newGroup.Key.profile.deed
                     }).ToList();
            return a;
  1. Convert.ToBoolean返回bool ,不是bool? ,所以沒有辦法filterInclude != nulltrue

  2. 您應該在where子句中使用以下模式,而不是三元運算符:

     var query = _repository.GetAll<Entity>(); if (apdvm.Filter_IncludeValue == "true") query = query.Where(x => x.include == true); else if (apdvm.Filter_IncludeValue == "false") query = query.Where(x => x.include == false); return query; 

    我假設apdvm.Filter_IncludeValue是一個字符串(這就是您嘗試在其上調用Convert.ToBoolean的原因)。

你可以用

private ICollection<AggregationEntityViewModel> getEntities(
              AggregationPracticeDetailsViewModel apdvm)
{
    bool? filterInclude = apdvm.Filter_IncludeValue.ConvertToNullable<bool>();

    var a = (from e in _repository.GetAll<Entity>()                         
             where !filterInclude.HasValue || ea.include == filterInclude.Value                     
             select new AggregationEntityViewModel()
             {
                Include = newGroup.Key.ea == null 
                          ? (true || false) 
                          : (bool)newGroup.Key.ea.include,
             }
    return a;
}

只需刪除您的(true||false)並在其中添加filterInclude == null

對於Nullable Value(取自將字符串轉換為可為null的類型(int,double等)

public static T? ConvertToNullable<T>(this String s) where T : struct 
{
    try
    {
        return (T?)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(s);
    }
    catch (Exception)
    {
        return null;
    }
}

還有另一種解決方案:

var query = from e in _repository.GetAll<Entity>();

if (filterInclude.HasValue)
{

    // when filterInclude is null (it means **ALL**), 
    // do not filter otherwise - check the flag
    query = query.Where(entity => entity.Include == filterInclude.Value);
}

// or one-line:
// query = query.Where(entity => filterInclude == null
//                      || entity.Include == filterInclude.Value);

var a = query.Select(entity => new AggregationEntityViewModel { .... });

return a;

另一個問題是Convert.ToBoolean從不返回null 您應該創建自己的方法來解析apdvm.Filter_IncludeValue

為了轉換為可為空的類型,您可以使用通用方法:

public static Nullable<T> ToNullable<T>(this string s) where T: struct
{
    Nullable<T> result = new Nullable<T>();
    try
    {
        if (!string.IsNullOrEmpty(s) && s.Trim().Length > 0)
        {
            TypeConverter conv = TypeDescriptor.GetConverter(typeof(T));
            result = (T)conv.ConvertFrom(s);
        }
    }
    catch { } 
    return result;
}

資源。

用法:

var filterInclude = apdvm.Filter_IncludeValue.ToNullable<bool>();

您可以使用流利的語法來簡化此操作:

private ICollection<AggregationEntityViewModel> getEntities(AggregationPracticeDetailsViewModel apdvm)
{
    var query = _repository.GetAll<Entity>();
    if(apdvm.Filter_IncludeValue != 'all')
    {
        var value = Convert.ToBoolean(apdvm.Filter_IncludeValue);
        query = query.Where(q => q.include == value)
    }
    return query.Select(q => new AggregationEntityViewModel {...}).ToArray();
} 

無需將字符串評估為可為null的布爾值或sm​​th。 與無需執行奇怪的布爾表達式相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM