我正在尝试对一组用户进行排序.我可以访问排序属性和方向(asc,desc).我目前的查询订单如下.但正如您所看到的那样,它并未考虑排序方向.如何在不必使用Dynamic Linq或为"asc"或"desc"排序方向添加另一组语句的情况下构建此表达式.
public override IQueryable<DalLinq.User> GetSort(IQueryable<DalLinq.User> query)
{
//SelectArgs.SortDirection <- Sort Direction
switch (SelectArgs.SortProperty)
{
case "LastName":
query = query.OrderBy(p => p.LastName);
break;
case "FirstName":
query = query.OrderBy(p => p.FirstName);
break;
default:
query = query.OrderBy(p => p.UserName);
break;
}
return query;
}
Run Code Online (Sandbox Code Playgroud) 我有一个关于Entity Framework4,Lambda表达式和数据传输对象(DTO)的半复杂问题.
所以我有一个小的EF4项目,并遵循既定的OO原则,我有一个DTO,在数据使用者(GUI)和数据模型之间提供一层抽象.
我的问题围绕着GUI使用DTO(并没有让GUI完全使用Entity),并且需要将lambda传递给数据层.我的数据层是Add的基本存储库模式.更改,删除,获取,获取列表等.尝试使用如下签名实现Find方法:
public IEnumerable<VideoDTO> Find(Expression<Func<VideoEntity, bool>> exp)
...
_dataModel.Videos.Where(exp).ToList<Video>()
---
Run Code Online (Sandbox Code Playgroud)
我的问题/关注点是"exp"需要是VideoEntity而不是VideoDTO.我想保留关注点的分离,以便GUI不知道Entity对象.但是,如果我试图传入
Func<VideoDTO, bool>
Run Code Online (Sandbox Code Playgroud)
然后我不能使用实际的数据模型在那个表达式上做LINQ.
有没有办法将a转换Func<VideoDTO,bool>为aFunc<VideoEntity, bool>
理想情况下,我的方法签名会接受Func<VideoDTO, bool>,这样GUI就不会引用底层数据实体.
这够清楚了吗?谢谢你的帮助
谢谢你们两个人的代表.
我将尝试在对象中定义搜索条件并在LINQ表达式中使用它.刚开始使用EF4和L2S,将其作为学习项目.
再次感谢!
我正在检查sort参数并构建一堆if语句:
if (sortDirection == "ASC")
{
if (sortBy == "Id")
return customerList.OrderBy(x => x.Id).Skip(startIndex).Take(pageSize).ToList();
if (sortBy == "FirstName")
return customerList.OrderBy(x => x.FirstName).Skip(startIndex).Take(pageSize).ToList();
if (sortBy == "City")
return customerList.OrderBy(x => x.City).Skip(startIndex).Take(pageSize).ToList();
}
else
{
if (sortBy == "Id")
return customerList.OrderByDescending(x => x.Id).Skip(startIndex).Take(pageSize).ToList();
if (sortBy == "FirstName")
return customerList.OrderByDescending(x => x.FirstName).Skip(startIndex).Take(pageSize).ToList();
if (sortBy == "City")
return customerList.OrderByDescending(x => x.City).Skip(startIndex).Take(pageSize).ToList();
}
Run Code Online (Sandbox Code Playgroud)
我该如何做得更好?
我正在使用下面的方法来查询EF
public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
if (orderBy != null)
{
return orderBy(query).ToList();
}
else
{
return query.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想创建动态Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>>表达式来订购我的数据.
我只知道字段名称为字符串和顺序类型(升序,降序)为字符串(asc,desc)
我可以使用orderby语句动态构建Linq Query,如下所示:
var Query = from q in Db.TblUsers select q;
switch (Order)
{
case "Name": Query = from q in Query orderby q.Name select q; break;
case "DOB": Query = from q in Query orderby q.DOB select q; break;
// ... and more cases
}
var Result = Query.ToList();
Run Code Online (Sandbox Code Playgroud)
但是,如果需要按顺序降序(取决于UI中的用户选择),我将不得不构造另一个switch语句复制所有情况,只是为了在orderby之后添加"descending"关键字.
例:
if (ascending)
{
switch (Order)
{
case "Name": Query = from q in Query orderby q.Name select q; break;
// ....
}
}
else
{
switch (Order)
{ …Run Code Online (Sandbox Code Playgroud) 我使用的是.NET 4.51,EF 6
我对我的存储库层进行了多次调用,我需要在升级或降序的单个字段上执行一些基本排序,例如:
结果GetAllList()是一个List<T>.现在不幸的是,Id我必须排序的字段并不总是被调用,Id也不是Text字段.它们可以是其他东西,例如MyId,SomeTextField等等.
所以我想知道是否有一种方法可以通过为字段名称提供字符串来执行OrderBy()和OrderByDescending()子句:
_Repository.GetAllList().OrderBy(r => r."SomeTextField")
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我可以将所有这些代码移动到一个通用方法.
任何指针都非常感激.
我有一个泛型类,可以使用通用的OrderBy参数
课程如下
class abc<T> where T : myType
{
public abc(....., orderBy_Argument ){ ... }
void someMethod(arg1, arg2, bool afterSort = false)
{
IEnumerable<myType> res ;
if ( afterSort && orderBy_Argument != null )
res = src.Except(tgt).OrderBy( .... );
else
res = src.Except(tgt);
}
}
Run Code Online (Sandbox Code Playgroud)
orderBy可以是各种类型
例如
.OrderBy( person => person.FirstName )
.OrderBy( person => person.LastName )
.OrderBy( person => person.LastName, caseInsensitive etc )
Run Code Online (Sandbox Code Playgroud)
目标是使orderBy成为一个参数,而不是将其烘焙
有任何想法吗 ?
我有一个像这样的签名的方法
void RefreshMethod<T>(IEnumerable<T> lst, string propertyName) where T:class
{
Type type = typeof(T);
PropertyInfo property = type.GetProperties().Single(u => u.Name == primaryKeyProperty);
//query goes here
}
Run Code Online (Sandbox Code Playgroud)
现在我想查询该集合以获取其所有值
propertyName <0
在一个简单的场景中,它就像这样容易
lst.where(u=>u.ID<0)
Run Code Online (Sandbox Code Playgroud)
但在这里我没有那个ID属性,但有相应的"PropertyInfo"对象.
我应该怎么做到这一点.
善意的指导
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.UI.WebControls;
using dynamic = System.Linq.Dynamic;
using System.Linq.Expressions;
namespace Project.Lib.Extensions
{
public static partial class Utils
{
public static List<T> SortForMe<T>(this List<T> list, string propertyName,SortDirection sortDirection)
{
string exp1 = string.Format("model.{0}", propertyName);
var p1 = Expression.Parameter(typeof(T), "model");
var e1 = dynamic.DynamicExpression.ParseLambda(new[] { p1 }, null, exp1);
if (e1 != null)
{
if (sortDirection==SortDirection.Ascending)
{
var result = list.OrderBy((Func<T, object>)e1.Compile()).ToList();
return result;
}
else
{
var result …Run Code Online (Sandbox Code Playgroud) 我试图找出如何排序GridView具有多个列(String,DateTime,Decimal这势必将自定义对象的泛型列表等数据类型).
MyObject.vb:
Public Property Id
Public Property Name
Public Property Date
Public Property Amount
Run Code Online (Sandbox Code Playgroud)
MyObjects.aspx.vb:
gridView.DataSource = GetMyObjects()
gridView.DataBind()
Run Code Online (Sandbox Code Playgroud)
注:GetMyObjects()返回List的MyObject
基本上,我需要能够单击网格的列标题进行排序和反向排序,并且还能够存储排序方向,ViewState以便每次单击列标题时方向都会保留.
好像我可能需要MyObject实现IComparable,但我不确定如何将它们放在一起.
任何人都可以建议一个很好的教程,或指出我正确的方向?
c# ×8
linq ×8
.net ×2
reflection ×2
sorting ×2
asp.net ×1
dynamic ×1
entity ×1
frameworks ×1
gridview ×1
iqueryable ×1
lambda ×1
linq-to-sql ×1
repository ×1
vb.net ×1