2015-06-12 49 views
3

我只是将这些数据发送到Asp.net MVC5中的报表引擎(SSRS)。
一切都很好,但这个查询花了很多时间,因为我必须循环通过ListProducts(我猜ListProducts是数据库匹配的大小)。其中列表中包含任何列表

我只是在寻找一种方法来优化这个查询。

我试过anycontains(如下图所示),但它们似乎不适用于单个表格。

context.Products.Where(w => w.ProductDetail.Any(a => a.startDate >= startDate 
                && a.endDate <= endDate)) 

我得到这个从here

2)我试图this as well

context.Products.Where(w => ListProducts.Any(x =>w.Contains(x))) 

但这也不能正常工作,并生成一个编译时错误

的System.Guid不包含'Contains'的定义

有没有其他方法,或者我正在做它唯一正确的方法?

foreach (var item in ListProducts) 
{ 
    List.AddRange(_context.Products.Where(w => w.ProductId== item).Select(q => new ProductVM 
    { 
     Name = q.Name, 
     Quantity = q.Quantity, 

    }).ToList().Select(item=> new ProductVM 
    { 
      Name = item.Name, 
     Quantity = item.Quantity, 
    }).ToList()); 
} 


public class Product 
{ 
    public Nullable<System.Guid> ProductId { get; set; } 
    public string Name { get; set;} 
    public decimal Quantity { get; set; } 
} 
+0

在你可能想提供一个定义或Product'的'POCO最起码的。可以推断,但是你让人们做更多的分析工作,而不是解决其他非常简单的问题。 – nathanchere

+1

你必须使用LINQ吗?如何通过'_context'执行Raw SQL,以便优化查询。你甚至可以使用像Dapper这样的ORM,它会很好地为你绘制你的对象。非常强大的工具,速度也非常快。有一个数据结构可以很好,所以我可以看到这一切如何在数据库中联系起来。 – scgough

+0

其实我没有提供原始的类和数据,由于一些限制,但我已经做出了基于这些类的例子,数据库的实际设计是相当复杂的,但我已经做了一个简单的例子,以便快速理解,所以你可以把它作为一个产品类具有像名称数量少的属性,我只是想获得数据,如问题中所解释的..如果需要更多的解释,然后随意问 – Dragon

回答

0

好吧,你可以这样做:

var thelist = _context.Products.Where(n => ListProducts.Contains(n.ProductId)).Select(n => new ProductVM 
{ 
    Name = n.Name, 
    Quantity = n.Quantity 
}).ToList(); 
+0

为什么在第二个例子中混合查询和方法格式?查询格式也需要一个'select'。 – juharr

+0

编辑@juharr - 你是对的!一直在大声思考。:) – scgough

+0

第一个给出此错误..错误'System.Collections.Generic.List .Contains(System.Guid)'的最佳重载方法匹配有一些无效的参数 – Dragon

相关问题