在 Linq 查询中使用数组

Use Array in Linq query

我的问题因不够具体而被否决并搁置。我会尝试指定

在 linq 之前我会做这个查询

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

现在有了 entity framework 和 link 我可以做到这一点

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

但是如果我想灵活地获取所有产品或只获取可访问的对象怎么办

在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,然后在附加的 linq 语句中使用 lProductAccess 对其进行过滤,但随后我使用了不必要的大量数据。

是否可以使用:

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();

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

var query = db.Products;

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

var result = query.ToList();

Are there possible drawbacks

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

需要注意的一件事是您的条件运算符不会编译;你不能 return 来自三元运算符的 boolint

也许你的意思是:

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

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

我使用 express profiler 来查看 linq 语句是如何翻译成 sql 的。它表明

productsAccessible.Contains(lProducts.ID) 

部分被翻译为

products.id in (comma seperated list of values)

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