我最近被要求查看我们可以搜索的一个C#网络表单,它应该在用户搜索时从我们的数据库返回结果。我通常是节点开发人员,但代码是代码,任务交给我。
我找到了运行代码的方法,并且我看到了这些丑陋的嵌套foreach循环,所以我设置了一些断点,令我惊讶的是,我的一个foreachloops在运行其中的代码之前突破了循环。我认为我找到了它,但我不确定为什么会发生这种情况。
下面是我的完整方法我甚至在foreach循环中放置了一个try / catch,但是没有异常被抛出。所以在我的调试器中说
的部分foreach (var b in bids)
这个foreach循环中的所有代码都不会执行,我不知道为什么。请有人帮忙
static public object GetData(DataManager value, string customer, string subdivision, string status, string user, string date, string tags, string serviceType, string pricingType)
{
var lst = new List<Bid_Master>();
using (var context = new BiddingDataContext(KP.Common.KPConnectionString))
{
context.DeferredLoadingEnabled = false;
var fdate = DateTime.Parse(date + " 00:00:00");
var tdate = DateTime.Parse(date + " 23:59:59");
var bids = context.Bid_Masters
.Where(x =>
(x.Customer_ID == customer || customer == "-1") &&
(x.Subdivision_ID == subdivision || subdivision == "-1") &&
(x.Bid_Status == status || status == "-1") &&
(x.Created_By == user || user == "-1") &&
(x.Pricing_Type.ToString() == pricingType || pricingType == "ALL") &&
((x.Created_Date > fdate && x.Created_Date < tdate) || date == "01/01/2000") &&
(x.Service_Type == serviceType || serviceType == "-1"))
.OrderByDescending(x => x.Created_Date);
try
{
foreach (var b in bids)
{
if (String.IsNullOrEmpty(tags))
lst.Add(b);
else
{
var arrtags = tags.Split(',');
var attrs = context.Bid_Master_Attributes.Where(x => x.BM_ID == b.BM_ID).ToList();
foreach (var attr in attrs)
{
foreach (var t in arrtags)
{
if (lst.FirstOrDefault(x => x.BM_ID == b.BM_ID) != null) continue;
var isDec = false;
decimal dVal = 0;
if (decimal.TryParse(t, out dVal)) isDec = true;
string sVal = t;
if ((isDec && attr.TagValueNum.HasValue && attr.TagValueNum == dVal) || sVal == attr.TagValueString)
{
lst.Add(b);
}
}
}
}
}
}
catch(Exception e)
{
Console.WriteLine(e);
}
}
var enumerable = lst.AsEnumerable();
Syncfusion.JavaScript.DataSources.DataOperations operation = new Syncfusion.JavaScript.DataSources.DataOperations();
if (value.Sorted != null && value.Sorted.Count > 0)
{
enumerable = operation.PerformSorting(enumerable, value.Sorted) as IEnumerable<Bid_Master>;
}
if (value.Where != null && value.Where.Count > 0) //Filtering
{
enumerable = operation.PerformWhereFilter(enumerable, value.Where, value.Where[0].Operator) as IEnumerable<Bid_Master>;
}
int count = enumerable.AsQueryable().Count();
if (value.Skip != 0) //Paging
{
enumerable = operation.PerformSkip(enumerable, value.Skip) as IEnumerable<Bid_Master>;
}
if (value.Take != 0)
{
enumerable = operation.PerformTake(enumerable, value.Take) as IEnumerable<Bid_Master>;
}
return new
{
result = enumerable,
count = count
};
}
答案 0 :(得分:1)
男孩,代码很难看。我发现的唯一的“跳跃”行就是你所描述的(我假设你理解if
语句)
foreach (var t in arrtags)
{
if (lst.FirstOrDefault(x => x.BM_ID == b.BM_ID) != null) continue;
continue
语句表示:“跳到循环的下一次迭代”。在这种情况下,arrtags
中的下一个元素。
如果 all foreach
中的代码未运行(不仅仅是其中的一部分),请确保实际填充bids
。
答案 1 :(得分:0)