两个条件使用linq 2实体检查where子句

时间:2011-09-02 21:50:50

标签: c# .net linq entity-framework linq-to-entities

嗨我有一个名为带列

的产品的表
                 product_id
                 prodcut_name
                 prodcut_price( values like 1200,2000,3000,100)
                 prodcut_desc
                 category_id(1,2,3,.....) 

包含列

的其他表格类别
              category_id(1,2,3.......)
              category_name(a,b,c....)

和实体名称是dbcontext ...

如何获得类别名称为“a”且产品价格> 500且<10000

的产品

我正在使用linq来实现...

任何人都会对此有所帮助......一个......

非常感谢....

3 个答案:

答案 0 :(得分:27)

您正在寻找逻辑运算符,这些是您将在c#中使用的运算符:

  • &&逻辑AND
  • ||逻辑OR
  • !逻辑NOT
  • ^逻辑(按位)XOR
  • COND ? TRUE-STATEMENT : FALSE-STATEMENT三元运营商

因此伪代码中的复合条件看起来像:

product_price > 500 AND product_price < 10000

现在,如果您在DB中没有外键,那么当您创建上下文时,它只会有DBSets,并且它们不具有导航属性。因此,您唯一的选择是使用Cubicle.Jockey的答案。

如果您在DB中有外键,您将在实体对象上拥有导航属性,并且您将能够执行以下操作:

var query = from p in dbcontext.products
where p.category.name == 'a' 
   && p.product_price > 500 
   && p.product_price < 10000
select p;

或者,您可以直接使用LINQ扩展方法:

  var query = dbcontext.Products.Where(p => p.category.name == 'a' 
                                         && p.product_price > 500 
                                         && p.product_price < 10000);

如果您需要列表或数组并想要关闭dbcontext,则在ToList上调用ToArrayquery

var products = query.ToList();

使用实体框架(EF)进行替代方法 - 内置EntitySQL查询语言。你将会有类似的表达方式:

var query = ProductsQuery.Where("it.Category.Name == 'a' AND it.Product_Price BETWEEN 500 AND 10000");

其中ProductsQueryObjectQuery<Product>

答案 1 :(得分:5)

from p in dbcontext.products
join c in dbcontext.category on p.category_id equals c.category_id
where p.product_price > 500 && p.product_price < 10000 && c.Name == "a"
select p

这将返回带有过滤结果的IQueryable。

根据Vittore的回答,如果存在外键限制,这将是更合适的版本:

from p in dbcontext.products
where p.category.name =='a' && p.product_price > 500 && p.product_price < 10000
select p;

答案 2 :(得分:1)

加入category_id上的产品和类别表格,然后使用where过滤掉product_price