我有一个gallery实体框架类,我试图使用ScottGu博客上发布的Dynamic Linq Library来查询实体集.失败的代码行读取:
return context.Galleries.OrderBy(sidx + " " + sord).Skip(page * rows).Take(rows).ToList();
Run Code Online (Sandbox Code Playgroud)
sidx =="名称",和sord =="desc".
Gallery对象确实有一个名为"Name"的属性.但是,执行时,我得到以下异常:
无法在当前范围或上下文中解析"标题".确保所有引用的变量都在范围内,加载了所需的模式,并且正确引用了名称空间.,接近简单标识符,第6行,第1列.
有谁知道这意味着什么?
我正在尝试使用Dynamic Linq(由ScottGu发布的那个)来执行GroupBy(lambda表达式).我有一个对象.我正在做AsQueryable.这就是我拥有的......
var result = Items.AsQueryable().GroupBy("DeliveryDate");
Run Code Online (Sandbox Code Playgroud)
但它给了我一个错误,说不能从使用中推断出论点.我认为它没有看正确的OrderBy.
物品是一个List<Stock>.
我尝试添加<> GroupBy但我认为我需要传递超过1项.我有点困惑.
我传入的字段(通过字符串)可以是任何类型,在此示例中它是DateTime.
如果我做我的标准LINQ它确实有效.即:
var result = Items.AsQueryable().GroupBy( x => x.DeliveryDate);
Run Code Online (Sandbox Code Playgroud)
这是扩展方法(来自ScottGu):
public static IQueryable GroupBy(this IQueryable source, string keySelector, string elementSelector, params object[] values) {
if (source == null) throw new ArgumentNullException("source");
if (keySelector == null) throw new ArgumentNullException("keySelector");
if (elementSelector == null) throw new ArgumentNullException("elementSelector");
LambdaExpression keyLambda = DynamicExpression.ParseLambda(source.ElementType, null, keySelector, values);
LambdaExpression elementLambda = DynamicExpression.ParseLambda(source.ElementType, null, elementSelector, values);
return source.Provider.CreateQuery(
Expression.Call(
typeof(Queryable), "GroupBy",
new Type[] { …Run Code Online (Sandbox Code Playgroud) 在我的项目中有一个Logic evaluation部分,它将输入作为包含logical expressions(true/false)的字符串.
我想评估此字符串并返回最终的布尔值.
string Logic="1&0|1&(0&1)"
//string Logic="true AND false OR true AND (false AND true)"
Run Code Online (Sandbox Code Playgroud)
这将是我的Logic.长度可能会增加.
有没有办法评估这个表达式LINQ / Dynamic LINQ?
我在ASP.NET MVC 3站点中的很多页面中使用数据表.他们使用服务器端分页,现在我想基于列标题实现排序.数据表带有iSortCol_0 哪个是单击列的int值.
我不喜欢这种方法,因为查询最终会像:
if(iSortCol_0 == 0)
{
// query
// OderBy(x => x.CarName)
}
Run Code Online (Sandbox Code Playgroud)
然后对每列重复这一过程(加上每个列的else子句按降序排序).所以我改变了我的方法,现在将列名传递给服务器.
我想出了以下内容:
Expression<Func<vw_Car, string>> sortExpression1 = null;
Expression<Func<vw_Car, int>> sortExpression2 = null;
switch(columnToSort)
{
case "InvoiceNo": sortExpression1 = x => x.CarNo; break;
case "ClientNumber": sortExpression1 = x => x.ForeName; break;
case "ClientName": sortExpression1 = x => x.SurName; break;
default: sortExpression2 = x => x.Age.Value; break;
}
// start of query
.OrderByDir(sortDirection, sortExpression1 , sortExpression2)
Run Code Online (Sandbox Code Playgroud)
现在OrderByDir看起来如下:
public static IOrderedQueryable<T> OrderByDir<T>(this IQueryable<T> source, …Run Code Online (Sandbox Code Playgroud) 我需要为动态搜索创建一个动态linq表达式.基本搜索工作正常,但无法使用集合.我能够获得该书的标题和作者,但未能获得所需的页面标题.我在行中获得了异常"left11 = Expression.Property(page1,"Heading");" . 我认为我构建的表达式无法识别List.怎么可能这样呢? 请参阅以下代码和stacktrace异常.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace XMLStorageAndFilter
{
public class Books
{
public Books()
{
Page = new List<Page>();
}
public string Title { get; set; }
public Author Author { get; set; }
public List<Page> Page { get; set; }
}
public class Author
{
public string FirstName { get; set; }
}
public class Page
{
public string Heading { get; set; }
} …Run Code Online (Sandbox Code Playgroud) 我正在使用动态排序对多个条件进行排序,这是我的代码:
public ActionResult WebGrid(int page = 1, int rowsPerPage = 10, string sortCol = "OrderID", string sortDir = "ASC", string sortSecCol = "OrderID", string sortSecDir = "ASC")
{
List<Orders> res;
using (var nwd = new NorthwindEntities())
{
var _res = nwd.Orders
.AsQueryable()
.OrderBy(sortCol + " " + sortDir, sortSecCol + " " + sortSecDir)
.Skip((page - 1) * rowsPerPage)
.Take(rowsPerPage)
.Select(o => new Orders
{
Run Code Online (Sandbox Code Playgroud)
我在这里尝试做的是,只要该列OrderID不是主要排序,我就希望该列成为次要排序,但是当我实际选择其他列作为主要排序时,它不起作用。
换句话说,当其他列按降序选择作为主要排序时,OrderID也应该按降序排列,我不确定我在代码中遗漏了什么。
OrderBy我使用的方法来自这里 (MSDN)。
我的LINQ查询如下
Dim Query = From t In New XPQuery(Of xUser)(Xpo.Session.DefaultSession)
.Where("Name=John").Select("new (Name as FirstName)")
Run Code Online (Sandbox Code Playgroud)
不幸的是我得到了错误 No property or field 'John' exists in type 'xUser'
当然我的xUser类中不存在这样的属性,但是我能解决这个问题吗?
在DynamicLinq类中读取后,我发现了这个功能
Function FindPropertyOrField(ByVal type As Type, ByVal memberName As String, ByVal staticAccess As Boolean) As MemberInfo
Dim flags As BindingFlags = BindingFlags.Public Or BindingFlags.DeclaredOnly Or _
If(staticAccess, BindingFlags.Static, BindingFlags.Instance)
For Each t As Type In SelfAndBaseTypes(Type)
Dim members As MemberInfo() = t.FindMembers(MemberTypes.Property Or MemberTypes.Field, _
flags, type.FilterNameIgnoreCase, memberName)
If members.Length <> 0 Then Return members(0) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用DynamicLINQ库做一个动态过滤系统。当您执行以下操作时,我会一切顺利:查找名字为 Bob 的人:
Context.Users.Where("FirstName == \"Bob\"");
Run Code Online (Sandbox Code Playgroud)
但是当我想这样做时遇到了问题:查找名字为“Bob”的人(Bob 存储在数据源中的双引号中)。
我尝试了一些不同的事情,包括转义转义双引号和其他一些变体:
Context.Users.Where("FirstName == \"\\\"Bob\\\"\"");
// or as a literal for readability
Context.Users.Where(@"FirstName == ""\""Bob\""""");
// From comments below
Context.Users.Where("FirstName == \"\"Bob\"\"");
Run Code Online (Sandbox Code Playgroud)
这些都不起作用。任何帮助将不胜感激。
谢谢。
编辑- 我现在只是在处理结果字符串。实际字符串是从模型生成的。
我正在尝试使以下代码正常工作,这对于MSSQL正常工作,但是由于我更改为使用mySql,因此无法正常工作
records.Content = db.areas
.Where(x => x.Name.Contains(filter)))
.OrderBy("dated desc")
.ToList();
Run Code Online (Sandbox Code Playgroud)
我收到错误消息“无法加载一种或多种请求的类型。获取LoaderExceptions属性以获取更多信息。”
string colName = "datedD" ;
Run Code Online (Sandbox Code Playgroud)
如何通过对colName变量进行排序?
`
我正在尝试找到一种方法在执行sql分组之前将UTC时间移动到Local.我正在使用System.Linq.Dynamic(在这里管理https://github.com/kahanu/System.Linq.Dynamic).它非常适合进行动态选择而无需在编译时获得所需的字段.在我们的例子中,我们以UTC格式存储所有日期时间.在这个动态选择中,可能有人想要在小时,年,月等上进行分组.在这种情况下,我们必须将数据移动到本地时间,以防止混淆.
例:
var select = queryable.Select(string.Format("new ({0}, {1})", datetimeColumn, someOtherColumn));
Run Code Online (Sandbox Code Playgroud)
通常在我们的tsql或甚至在使用lambda表达式的实体框架中,您可以添加所需的偏移量.但是在动态linq选项中,您似乎无法像使用Linq2Sql那样执行任何日期操作,如DateTime.AddHours(x)或DateTime.Subtract(x).实体框架6希望您使用DbFunctions.AddHours(x)等.但是动态linq代码在没有修改的情况下不会接受DbFunction而不会出错.
例:
var select = queryable.Select(string.Format("new (System.Data.Entity.DbFunctions.AddHours({0},7) as {0}, {1})", datetimeColumn, someOtherColumn));
Run Code Online (Sandbox Code Playgroud)
返回错误:XXX类型
中不存在属性或字段"System" (删除命名空间无效).
使用所需的代码:
var select = queryable.Select(string.Format("new ({0}.AddHours(7), {1})", datetimeColumn, someOtherColumn));
Run Code Online (Sandbox Code Playgroud)
结果有错误:LINQ to Entities无法识别方法'System.DateTime AddHours(Double)'方法,并且此方法无法转换为商店表达式.
我希望SQL在groupby之前执行日期时间数学运算.一旦groupby发生,就不再有UTC的概念,因为用户将看到本地化的结果集.
我担心我只是为了支持传递实体框架扩展而更新我的github fork以支持传递实体框架扩展,但在此之前,想知道是否有其他人有解决方案或想法.
注意:由于更改SQL数据存储技术的可能性,我没有使用DateTimeOffset.