在 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 来自三元运算符的 bool
和 int
。
也许你的意思是:
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)
我的结论是它会正常工作。
我的问题因不够具体而被否决并搁置。我会尝试指定
在 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 来自三元运算符的 bool
和 int
。
也许你的意思是:
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)
我的结论是它会正常工作。