从数据库获取价值到Linq where子句

时间:2019-01-22 08:45:52

标签: c# sql sql-server linq linq-to-entities

我有一个名为FILTRE_LINKLER的表,列的名称为

  1. ID
  2. SEF_URL
  3. 条件

例如

  • ID = 1
  • SEF_URL =“ test /”
  • CONDITIONS =“ STOCK> 50”`

我想在linq where子句中获得CONDITIONS部分。

var product = (from d in db.PRODUCTS
                       where *CONDITIONS from DB*
                       select new ProductModel
                       {
                           Description= d.DESCRIPTION,
                           Brand= d.BRANDS.BRAND,
                           SefUrl = sef_url,
                           Name= d.NAME,

                       });

我尝试这样做:

var query = db.FILTRE_LINKLER.Select(x => x.CONDITIONS);
 var product = (from d in db.PRODUCTS
                       where query
                       select new ProductModel
                       {
                           Description= d.DESCRIPTION,
                           Brand= d.BRANDS.BRAND,
                           SefUrl = sef_url,
                           Name= d.NAME,

                       });

但是我有一个错误,无法将类型'System.Linq.IQueryable'隐式转换为bool。

我编辑是因为“问题已解决”。 解决方案:

下载Install-Package System.Linq.Dynamic -Version 1.0.7(对我说@StepUp) 然后添加到类

using System.Linq.Dynamic;

然后使用下面的代码

 var whereCondition = db.FILTRE_LINKLER.Select(x => x.CONDITIONS).FirstOrDefault();
var product = (from d in db.PRODUCTS
                       where query
                       select new ProductModel
                       {
                           Description= d.DESCRIPTION,
                           Brand= d.BRANDS.BRAND,
                           SefUrl = sef_url,
                           Name= d.NAME,

                       }).Where(whereCondition);

2 个答案:

答案 0 :(得分:1)

您要的是将数据库中存在的条件动态转换为linq中的位置。虽然没有魔术的说法,那就说使用它。您将必须编写一个扩展程序,该扩展程序可以解释数据库中编写的条件并返回一个谓词,然后可以在where子句中使用它。

答案 1 :(得分:0)

Try to use Dynamic LINQ。这是使用Dynamic LINQ库的代码示例:

var query = northwind.Products
                         .Where("CategoryID = 3 AND UnitPrice > 3")
                         .OrderBy("SupplierID");

在您的情况下:

var whereCondition = db.FILTRE_LINKLER.Select(x => x.CONDITIONS).FirstOrDefault();
var product = (from d in db.PRODUCTS
                   select new ProductModel
                   {
                       Description= d.DESCRIPTION,
                       Brand= d.BRANDS.BRAND,
                       SefUrl = sef_url,
                       Name= d.NAME,

                   })
              .Where(whereCondition);

更新:

  1. 首先,您应该下载代码以使用Dynamic queries by this link

  2. 然后使用项目DynamicQueryable中的Dynamic Query

  3. 然后将动态查询与IQueryable<T>一起使用。

让我展示一个例子:

var persons = new List<Person>()
{
    new Person(){Id = 1, FirstName = "1"},
    new Person(){Id = 2, FirstName = "2"},
    new Person(){Id = 3, FirstName = "3"}
};
var personWithIdTwo = persons
   .AsQueryable()
   .Where("Id==2");

更新1:

如果您不想添加课程,请then you can use an Expression Tree

表达式树的示例:

var propName = "STOCK"; // here you assign any value
var constValue = "50";  // here you assign any value
var param = Expression.Parameter(typeof(ProductModel), "p");
var exp = Expression.Lambda<Func<ProductModel, bool>>(
    Expression.GreaterThan(
       Expression.Property(param, propName),
       Expression.Constant(constValue)
    ),
    param
);
var product = (from d in db.PRODUCTS
                   where query
                   select new ProductModel
                   {
                       Description= d.DESCRIPTION,
                       Brand= d.BRANDS.BRAND,
                       SefUrl = sef_url,
                       Name= d.NAME,

                   }).Where(exp);

更新2:

您可以通过NuGet下载库Dynamic query。因此,您不应在项目中创建类:

enter image description here