【问题标题】:Get value from Database to Linq where clause从数据库获取值到 Linq where 子句
【发布时间】:2019-06-15 16:35:52
【问题描述】:

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

  1. 身份证
  2. SEF_URL
  3. 条件

例如,

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

我想将 CONDITIONS 部分加入到 linq where 子句中。

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”隐式转换为布尔值。

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

下载安装包 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);

【问题讨论】:

  • 你问的是如何动态添加条件?使用扩展方法而不是查询语法,并在 .Where() 调用中传递您想要的任何条件。例如if (useColor) { query=query.Where(product=>product.Color='Red'); }
  • 这个STOCK在你的CONDITIONS中来自哪里?
  • 是的,我想动态添加,但它必须来自数据库,因为条件可以改变。这取决于客户。其中一个想要 Stock>50,而其他人想要 productName='test'。我想写一个代码通用用法。

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


【解决方案1】:

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 queriesby this link。

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

  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。所以你不应该在你的项目中创建类:

【讨论】:

  • 没有用。 “无法从 system.linq.expressions.expression 转换为 system.func”我收到的错误消息。
  • @AnilSengul 请看我更新的答案。您应该创建类来处理动态查询。
  • 只是我想补充一点。我必须为小事添加课程。还有其他方法吗?
  • 属性和常量必须是动态的。这些在同一个字符串中
  • 是的,这对我来说已经足够了。问题解决了。谢谢回答。我通过编辑我的问题分享了上面的解决方案。
【解决方案2】:

您要问的是动态地将数据库中存在的条件转换为 linq 中的位置。虽然没有神奇的声明,但说使用这个。您必须编写一个扩展来解释写入数据库中的条件并返回一个谓词,然后您可以在 where 子句中使用该谓词。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
相关资源
最近更新 更多