我的问题被投票并搁置,因为它不够具体。我试着指定
在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();
答案 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)
是否存在可能的缺点
当然 - 它可能会产生效率低下的查询,或者甚至可能无法正常工作。
有一点需要注意的是,你的条件运算符不会编译;您无法从三元运算符返回bool
和int
。
也许你的意思是:
var products = (from lProducts in db.Products
where (useProductAccess ?
productsAccessible.Contains(lProducts.ID)
: true)
select lProducts).ToList();
或使用方法语法构建查询,并在必要时仅添加where
子句。