Linq查询未给出预期结果

时间:2018-02-09 14:43:32

标签: c# linq

经过相当复杂的代码返工后,我偶然发现了一小部分没有给我预期结果的代码。以下Linq查询应通过仅选择包含特定字符串的数据来查询主对象中包含的数据。

主列表包含约5500个条目。执行Linq查询后,辅助对象仍包含这5500个条目。我是盲人还是已经精神错乱? CompanyName参数包含有效存在的公司。

更新:如果数据是从缓存中获取的,则列表包含所有相关条目,只是查询似乎没有任何效果。

public List<Account> GetAccountsByValue(string CompanyName)
{
    string CacheKey = "Accounts";
    ObjectCache dataCache = MemoryCache.Default;

    if (dataCache.Contains(CacheKey))
    {
        var ResultCached = (IEnumerable<Account>)dataCache.Get(CacheKey);
        var ResultCached2 = from c in ResultCached
                            where c.Name.Contains(CompanyName)
                            select new
                            {
                              c.Name,
                              c.Street,
                              c.City,
                              c.ID
                            };
        var temp = ResultCached2.ToList();
        return temp;
    }
    else
    {
        IList<CrmAccount> Accounts = CrmServiceAgent.GetAccounts();
        var ResultNoCache = from CrmAccount f in Accounts
                            orderby f.DisplayName
                            select new Account(f);

        // put the data in the cache
        CacheItemPolicy cacheItemPolicy = new CacheItemPolicy();
        cacheItemPolicy.AbsoluteExpiration = DateTime.Now.AddHours(4.0);
        dataCache.Add(CacheKey, ResultNoCache, cacheItemPolicy);

        return ResultNoCache.ToList();
    }
}

查询的数据列表如下所示(在WCF测试客户端中)

enter image description here

一切正常,只有查询部分没有效果,这意味着再次返回所有条目,而不是只返回包含查询参数的条目。

enter image description here

更新: 实际上我得到一个Null引用异常,可能是因为前几个条目的Name-Attribute是null ....

现在抛出错误了:

var ResultCached3 = ResultCached.Where(c => c.Name.Contains(CompanyName)).ToList();

enter image description here

2 个答案:

答案 0 :(得分:0)

我现在已经修好了整件事。现在,从数据库查询的数据不再包含任何空值。问题是,必填字段仅在前端而非数据库级别进行检查。所以通常是强制性的数据被导入为空值

所以现在在列表中我只有&#34;有效&#34;数据,现在linq查询可以正常工作。

谢谢大家的提示和建议!

亲切的问候 桑德罗

答案 1 :(得分:-3)

 var ResultCached2 = (from c in ResultCached
   where c.Name.Contains(CompanyName)
   select new
   {
    c.Name,
    c.Street,
    c.City,
    c.ID
   }).ToList();