标签: dynamic-linq

LINQ动态查询库

我正在使用Entity Framework 4构建一个ASP.Net MVC 3应用程序.当执行下面两段代码时,两个变量(query1和query2)的返回类型都是

System.Data.Objects.ObjectQuery<Asset.Model.Equipment>
Run Code Online (Sandbox Code Playgroud)

Query1使用ObjectContext的直接实例,但是,Query2使用存储库模式,即它在EquipmentService中调用GetEquipment,后者又在Equipment Repository中调用相同的命名方法.Service和Repository中的两个方法都返回

IQueryable<Equipment>
Run Code Online (Sandbox Code Playgroud)

如何,这是我的问题,为什么query2只有在我包含时才会起作用

using System.Linq.Dynamic;
Run Code Online (Sandbox Code Playgroud)

在我的控制器的顶部

using (AssetEntities context = new AssetEntities())
        {
            var query1 = context.Equipments
            .OrderBy("it." + sidx + " " + sord)
            .Skip(pageIndex * pageSize)
            .Take(pageSize);
        }


        var query2 = equipService.GetEquipment()
            .OrderBy(sidx + " " + sord)
            .Skip(pageIndex * pageSize)
            .Take(pageSize);
Run Code Online (Sandbox Code Playgroud)

如果我从我的控制器omitt System.Linq.Dynamic,我在Query2中得到一个错误

.OrderBy(sidx + " " + sord)
Run Code Online (Sandbox Code Playgroud)

哪个州

The type arguments for method 'System.Linq.Queryable.OrderBy<TSource,TKey>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,TKey>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么query1可以工作而不必使用System.Linq.Dynamic,但是query2需要它来执行? …

linq-to-entities jqgrid dynamic-linq entity-framework-4 asp.net-mvc-3

7
推荐指数
1
解决办法
8929
查看次数

动态或条款Linq

今天我们现在有一个这样的声明:

var Query = (from dp in db.Patients
            select dp);

var UserID = User.Identity.GetUserId();

if (User.IsInRole("Administrator"))
{
    Query = Query.Where(x => x.AdministratorID == UserID);
}
if (User.IsInRole("Counselor"))
{
    Query = Query.Where(x => x.CounselorID == UserID);
}
if (User.IsInRole("Physician"))
{
    Query = Query.Where(x => x.PhysicianID == UserID);
}
Run Code Online (Sandbox Code Playgroud)

问题是我们有可以拥有多个角色的用户.如果用户同时是辅导员和医师,我们希望系统撤回所有患者,其中CounselorID == UserID或PhysicianID == UserID.

如果我们不知道用户在加载页面时将扮演什么角色,如何动态完成?

当前.Where子句只使用AND语句,我们需要一个OR语句.

理想情况下会有这样的解决方案:

if (User.IsInRole("Administrator"))
{
     Query = Query.Where(x => x.AdministratorID == UserID);
}
if (User.IsInRole("Counselor"))
{
     Query = Query.WhereOr(x => x.CounselorID == UserID); …
Run Code Online (Sandbox Code Playgroud)

c# linq dynamic-linq where-clause conditional-statements

7
推荐指数
2
解决办法
2048
查看次数

动态LINQ表达式中的空引用异常

我正在使用Microsoft的Dynamic Linq Library/Sample在列表上进行排序.例如,我有以下C#代码:

   myGrid.DataSource=repository.GetWidgetList()
         .OrderBy(sortField + " " + sortDirection).ToList();
Run Code Online (Sandbox Code Playgroud)

我有一个案例,我的对象与另一个对象有0:1的关系,它有一个可能在网格中显示的属性.当我们尝试对它进行排序时,只要我的所有小部件都有这个孩子,它就能正常工作.我们以订购Child.Name为例.但是当Child为null时,我们得到null引用异常.

我有一些选项,我知道我可以选择一个匿名类型并绑定到那个,我也可以在父对象上公开Child.Name并通过代码处理它(我不喜欢包含我的对象模型) ).

在一个理想的世界里,我想更新库以处理这种情况.在我深入研究它之前,我想知道是否有人遇到过这个问题并且已经有解决方案了吗?

编辑

看起来我说得不够好.我使用的是带有C#样本Dynamic Linq库.这个库添加了一些很好的扩展,让你在lambda表达式中使用字符串所以我的代码实际上是这样的:

private  void BindGrid(sortField,sortDirection)
{

     this.grid.DataSource=....OrderBy("MyField ASC")....
}
Run Code Online (Sandbox Code Playgroud)

当然,那里的字符串被参数替换.但这允许我们在用户点击网格标题时动态更改排序.我们没有必要的其他逻辑来处理所有的排列.

我记录下来的解决方案将我的干净方法改为:

private void BindGrid()
{
   var sortField=this._sortField;
   if (sortField=="Child.Name")
   {
       sortField="iif(Child==null,null,Child.Name)";
   }
   this.grid.DataSource=repository.GetWidgetList()
                                  .OrderBy(sortField + " " + this._sortDirection)
                                  .ToList();
}
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但现在这意味着我必须更新此代码,因为我们要添加我们想要在子对象上的网格中公开的新字段或属性.

c# linq dynamic-linq

6
推荐指数
1
解决办法
4861
查看次数

使用未知类型执行DynamicExpression

如果有人非常熟悉Linq.Dynamic命名空间,我可以使用一些帮助 - 无法在互联网上找到任何深入的资源.

基本上我正在使用DynamicExpression.ParseLambda创建一个表达式,其中类型在编译时是未知的,

public Expression GetExpression(Type t, List<QueryFilter> filters)
{
   // pseudo code
   // extracts a string representation of the query as 'expressionString'

   return DynamicExpression.ParseLambda(t, typeof(Boolean), expressionString, values);
}
Run Code Online (Sandbox Code Playgroud)

QueryFilter的位置是:

public class QueryFilter 
{
    string propertyName;
    ExpressionType operationType;
    object value;
}
Run Code Online (Sandbox Code Playgroud)

它代表一个简单的二进制函数,如"Age> 15"或其他东西.

这就是'GetExpression'函数的工作方式,它有两种类型 - 一种是输入类型,另一种是输出类型,最终生成通常用Func委托创建的类型.它还需要一个表示查询的字符串和一个值的params对象[],分别是上面的'expressionString'和'values'.

但是,我在使用从SqlMetal(.dbmc文件)生成的DataContext在LINQ-to-SQL中执行动态表达式时遇到问题.

DatabaseContext db = new DatabaseContext(connectionString);

var filter = DynamicExpressionBuilder.
      GetExpression(typeof(SysEventLogT), sysEventFilters)

var query = db.SysEventLogT.Where(filter);
Run Code Online (Sandbox Code Playgroud)

产生以下错误,

System.Data.Linq.Table<DBReporting.Linq.Data.SysEventLogT>
Run Code Online (Sandbox Code Playgroud)

不包含'Where'的定义和最佳扩展方法重载

System.Linq.Dynamic.DynamicQueryable.Where<T>(System.Linq.IQueryable<T>, string, params object[]) 
Run Code Online (Sandbox Code Playgroud)

有一些无效的论点.

我知道我的DataContext实例实际上将sql表视为属性...我是否需要以某种方式反映GetProperty()才能使其工作?或许我需要创建另一个.哪个扩展?

c# linq lambda expression-trees dynamic-linq

6
推荐指数
1
解决办法
3321
查看次数

包含括号的动态LINQ查询的问题

我在.NET MVC应用程序中使用Dynamic Linq Library(这一个)来查询SQL Server数据库.到目前为止一切正常.

但是,每当我使用方括号指定包含空格或连字符的麻烦的列名称时,Dynamic Linq库会给出"表达式预期"错误.这里有些例子:

var query = context.FetchIceCream().AsQueryable().Where("Chocolate = 1"); // This is fine
var query = context.FetchIceCream().AsQueryable().Where("[Rum and Raisin] = 1"); // This results in an "Expression expected" error
Run Code Online (Sandbox Code Playgroud)

我无法重命名任何列名,所以这不是一个选项 - 我需要能够在代码中对此进行排序.我一直在寻找解决方案,但无济于事......请帮助我保持理智!

.net sql linq sql-server dynamic-linq

6
推荐指数
1
解决办法
1625
查看次数

动态LINQ日期时间比较字符串构建 - Linq To实体

我正在使用Scott Guthrie的动态LINQ库以及Entity Framework和C#.

我必须根据几个因素将where字符串构建到变量中,然后将字符串变量传递给where子句.出于某种原因,这将有效:

ContactList = ContactList.Where("DateAdded >= @0", DateTime.Parse("12/1/2012"));
Run Code Online (Sandbox Code Playgroud)

但这不起作用

string WhereClause = string.Format("DateAdded >= {0}", DateTime.Parse("12/1/2012"));
ContactList = ContactList.Where(WhereClause);
Run Code Online (Sandbox Code Playgroud)

如前所述,我需要在传递变量的版本中使用它.谁知道为什么第二个不起作用?

提前致谢!

c# linq string entity-framework dynamic-linq

6
推荐指数
2
解决办法
1万
查看次数

动态linq中的调用函数

我试图在动态linq select语句中调用一个函数,但我得到错误:

No property or field 'A' exists in type 'Tuple2'
Run Code Online (Sandbox Code Playgroud)

示例代码:

void Main()
{
    var a = new Tuple<int, int>(1,1);
    var b = new[]{ a };
    var q = b.AsQueryable().Select("A.Test(it.Item1)");

    q.Dump();
}

public static class A
{
    public static int Test(int i)
    {
        return i++;
    }
}
Run Code Online (Sandbox Code Playgroud)

我该如何更改代码才能使其正常工作?

如果我调用内置函数Convert.ToInt32,例如它工作正常.

var q = b.AsQueryable().Select("Convert.ToInt32(it.Item1)");
Run Code Online (Sandbox Code Playgroud)

另外我如何使用动态linq转换属性?

var q = b.AsQueryable().Select("((float)it.Item1)");
Run Code Online (Sandbox Code Playgroud)

c# linq linq-to-objects dynamic-linq

6
推荐指数
3
解决办法
3958
查看次数

动态LINQ比较实体框架中的日期

我正在使用动态linq库与实体框架,并希望比较日期.我已成功地扩展基于以下SO文章库这里不过似乎什么我不能做的是使该库比较只是我的实体对象的日期时间属性的日期部分,我会与正常的LINQ表达式做.

我想要做的是让动态linq像这样创建一个lambda:

// Compare just dates
p => p.CreatedDate.Value.Date == '2012/08/01'
Run Code Online (Sandbox Code Playgroud)

而不是:

// Compares date + time
p => p.CreatedDate == '2012/08/01'
Run Code Online (Sandbox Code Playgroud)

对此有任何想法将非常感激.

.net linq linq-to-entities entity-framework dynamic-linq

5
推荐指数
1
解决办法
2283
查看次数

C# DynamicLinq where 子句与 Any()

我想用这样的字符串 where 子句运行动态 linq:

query = db.Customers.Where("Categories.Any(Code == 'Retail')");
Run Code Online (Sandbox Code Playgroud)

客户实体具有类别集合

class Customer
{
    public List<Category> Categories {get;set;}
    ...
}

class Category
{
    public Guid Id {get;set;}
    public string Code {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我有没有可能做这样的事情?

PS:我需要 where 子句是字符串。where 子句将在运行时生成,因此我不能使用 Linq 查询表达式。

我正在使用 Telerik DataAccess。

c# linq dynamic-linq

5
推荐指数
1
解决办法
1223
查看次数

将我的值类型转换为可空等价物

我有一个特别报告系统;我对查询的源类型或所需字段没有编译时知识。我可以在运行时使用System.Linq.Expressions.Expression工厂方法编写表达式树,并使用反射调用 LINQ 方法,但动态 LINQ 是一个更简单的解决方案。

报告系统允许查询返回 LEFT JOIN 的结果。连接表中有字段在NOT NULL数据库中;但因为这是一个LEFT JOIN,这些字段将包含NULL某些记录。EF6 生成的表达式属于此,因为表达式投影到不可为空的值类型。

如果我在编译时 LINQ 中这样做,我会显式转换为可空类型:

enum Color { Red, Green,  Blue }

// using System;
// using static System.Linq.Enumerable;
// using System.Linq;

var range = Range(0, 3).Select(x => (Color)x).AsQueryable();
var qry = range.Select(x => (Color?)x);
Run Code Online (Sandbox Code Playgroud)

动态 LINQ 支持显式转换:

// using static System.Linq.Dynamic.Core

var qry1 = range.Select("int?(it)");
Run Code Online (Sandbox Code Playgroud)

但在查询中只能引用一组特定的类型。如果我尝试Color在查询中使用:

var qry2 = range.Select("Color(it)");
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

“颜色”类型中不存在适用的方法“颜色”

如果我尝试显式转换为Color?

var qry3 …
Run Code Online (Sandbox Code Playgroud)

c# linq dynamic-linq dynamic-linq-core

5
推荐指数
1
解决办法
484
查看次数