在Linq查询中使用Array

时间:2015-02-11 16:12:47

标签: c# linq

我的问题被投票并搁置,因为它不够具体。我试着指定

在linq之前我会做这个查询

sql="SELECT products.* FROM products INNER JOIN productaccess ON products.id=productaccess.productid"

现在有了实体框架和链接,我可以做到这一点

var products = (from lProducts in db.Products 
            join lProductAccess in db.ProductAccess on lProducts.ID equals lProductAccess.ProductID  
            select lProducts).ToList();

但是,如果我希望flexibilty获取所有产品或仅获取可访问的对象

,该怎么办?

在sql中我可以这样做

sql="SELECT products.* FROM products "
if (useProductAccess) {
    sql+=" INNER JOIN productaccess ON products.id=productaccess.productid"             
}

在Linq中,我必须单独制作一个linq语句。

if (useProductAccess) {
    var productsFiltered = (from lProducts in db.Products 
            join lProductAccess in db.ProductAccess on lProducts.ID equals lProductAccess.ProductID  
            select lProducts).ToList();
} else {
    var productsAll = (from lProducts in db.Products select lProducts).ToList();
}

现在,我可以获取所有lProducts,然后使用lProductAccess在另一个linq语句中过滤它,但后来我使用了不必要的大量数据。

是否可以选择使用:

var productsAccecible = (from lProductAccess in db.ProductAccess where lProductAccess.CustID==custID select lProductAccess).toArray();

var products = (from lProducts in db.Products 
                where (useProductAccess ?
                   productsAccessible.Contains(lProducts.ID) 
                   : true) 
            select lProducts).ToList();

3 个答案:

答案 0 :(得分:1)

Linq提供程序不知道如何在有效的sql中转换三元运算符(?:),你可以试试这个:

var query = db.Products;

if (useProductAccess)
   query = query.Where(p => productsAccessible.Contains(p.ID));

var result = query.ToList();

答案 1 :(得分:1)

我使用了快速分析器来查看linq语句是如何转换为sql的。它显示了

productsAccessible.Contains(lProducts.ID) 

部分被翻译为

products.id in (comma seperated list of values)

我的结论是它会正常工作。

答案 2 :(得分:0)

  

是否存在可能的缺点

当然 - 它可能会产生效率低下的查询,或者甚至可能无法正常工作

有一点需要注意的是,你的条件运算符不会编译;您无法从三元运算符返回boolint

也许你的意思是:

var products = (from lProducts in db.Products 
                where (useProductAccess ?
                       productsAccessible.Contains(lProducts.ID) 
                       : true) 
                select lProducts).ToList();

或使用方法语法构建查询,并在必要时仅添加where子句。