我的代码就像
DepartmentPaperConsumption dto = null;
Run Code Online (Sandbox Code Playgroud)
然后我有NHibernate QueryOver结果,我想订购它
result.OrderByAlias(() => dto.TotalColorCopys);
Run Code Online (Sandbox Code Playgroud)
但我希望能够dto用字符串动态指定任何属性.我尝试使用动态LINQ,但似乎我无法得到它.我也试过从头开始构建LambdaExpression - 也没有运气.我将不胜感激任何帮助.
我正在编写一个列表排序扩展方法.我的输入是列表和带有属性名称和排序方向的字符串.这个字符串可以有多个属性,如:"Name ASC,Date DESC"等.
我已经实现了字符串解析并使用了反射来从字符串中获取属性本身,但我现在所困扰的是如何动态链接orderby方法.
像:
_list.orderBy(x=>x.prop1).thenBy(x=>x.prop2)等等
有没有办法动态构建它?
在我的'Person'课程中,我有一些字段,如'firstname','lastname','nickname'等等.
我想编写动态搜索的代码,有时候是'firstname',有时是'nickname'字段.
以常规方式,代码将是:
If(SearchBy == "firstname")
{
Person result = ListOfPerson.Where(p => p.firstname== "exp").FirstOrDefault();
}
else If(SearchBy == "nickname")
{
Person result = ListOfPerson.Where(p => p.nickname== "exp").FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
但是我想写的代码应该是这样的:(每次保存if)
Object someVariable = "firstname";
Person result = ListOfPerson.Where(p => p.someVariable == "exp").FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
任何人都可以知道它是否可能?
如何将要在linq查询中使用的lambdaexpression定义为变量?
例如,当按列表项的不同属性对通用列表进行排序时:
IList<SampleClass> list = new List<SampleClass>();
// Populate list
...
list.OrderBy(sampleclass => sampleclass.property1);
list.OrderBy(sampleclass => sampleclass.property2);
Run Code Online (Sandbox Code Playgroud)
我想在一个变量中定义lambda表达式(sampleclass => sampleclass.property1)并调用:
// ??? define expression in a variable ???
Expression expression = sampleclass => sampleclass.property1;
// Sort list by variable expression
list.OrderBy(expression);
Run Code Online (Sandbox Code Playgroud)
在此先感谢Tobi
我有一个类(Patch),我想要排序,所以我实现了IComparer.
但是,它需要根据用户的需要进行排序,例如: - key1,key2,key3 - key1,key3,key2
对于每个密钥比较,我写了一个IComparer类,但是,我想知道如何实现它的连接.即排序时我只能传递一个IComparer实例.
或者我应该为每种完整排序创建一个IComparer类,即IComparerKey1Key2Key3,IComparerKey1Key3Key2等?
例如,我想尝试这样的事情。排序部分可能没有、1 个或多个按不同顺序排序的列。但我无法使用该ThenBy方法,因为它仅在OrderBy. 下面的代码将不断将顺序重置为排序列表中的最后一项。我也不想更改方法签名。非常感谢您的帮助,谢谢。
public IQueryable<Person> FilterList(string forename, List<Sorting> sorting)
{
IQueryable<Person> query = dc.Set<Person>();
if(!string.IsNullOrEmpty(forename)){
query = query.Where(w=>w.Forename.Contains(forename));
foreach(var sort in sorting)
{
switch(sort.By)
{
case "asc":
switch(sort.Sort)
{
case "forename":
query = query.OrderBy(o=>o.Forename);
break;
case "surname":
query = query.OrderBy(o=>o.Surname);
break;
}
break;
case "desc":
switch(sort.Sort)
{
case "forename":
query = query.OrderByDescending(o=>o.Forename);
break;
case "surname":
query = query.OrderByDescending(o=>o.Surname);
break;
}
break;
}
}
return query;
}
public class Sorting
{
public string Sort{get;set;}
public string By{get;set;} …Run Code Online (Sandbox Code Playgroud) 好的,我找到了这个,这将允许我这样做:
public IList<Item> GetItems(string orderbyColumn)
{
return _repository.GetItems().OrderBy(orderByColumn).ToList();
}
Run Code Online (Sandbox Code Playgroud)
这是进行"动态"排序的最佳方式吗?我希望能够将列名作为字符串(和排序方向)传递给我的服务,并让它以正确的方式排序.
我试着根据要求在查询中加入4个表.因为我想在where子句中动态添加条件,所以我现在可以为2表查询执行此操作.但这4个表连接在这里是复杂的连接.为了扩展我正在使用以下代码添加动态where子句的功能:
public static class Extensions
{
public static IQueryable<T> AddEqualityCondition<T, V>(this IQueryable<T> queryable,
string propertyName, V propertyValue)
{
ParameterExpression pe = Expression.Parameter(typeof(T), "p");
IQueryable<T> x = queryable.Where<T>(Expression.Lambda<Func<T, bool>>(Expression.Equal(Expression.Property(pe, typeof(T).GetProperty(propertyName)), Expression.Constant(propertyValue, typeof(V)), false, typeof(T).GetMethod("op_Equality")), new ParameterExpression[] { pe }));
return (x);
}
}
Run Code Online (Sandbox Code Playgroud)
//我的代码添加条件:
Query is:
var agrs = (from agr in _dbContext.Agreements
join amdv in _dbContext.AgreementMetaDataValues on agr.AgreementID equals amdv.AgreementID
join emd in _dbContext.EntityMetadatas on amdv.AttributeId equals emd.AttributeId
join et in _dbContext.Entities on agr.EntityID equals et.EntityId
select new agr, amdv,emd …Run Code Online (Sandbox Code Playgroud) 我有一点问题,我会试着详细解释一下.
在我的系统上,我有一个使用EF 4.1的通用存储库.一切都很棒,但我在某种情况下遇到问题我需要通过一些查询来做动态排序.
我通过参数接收一个表示我班级字段的"字符串"来执行orderBy(如"id"或"description")
部分代码:
public class SomeClass
{
public int id { get; set; }
public string description { get; set; }
}
// First we define the parameter that we are going to use
// in our OrderBy clause. This is the same as "(parameter =>"
// in the example above.
var param = Expression.Parameter(typeof(SomeClass), "parameter");
// Now we'll make our lambda function that returns the
// request.SortingName property by it's name.
var expression = Expression.Lambda<Func<SomeClass, int>>(Expression.Property(param, request.SortingName), …Run Code Online (Sandbox Code Playgroud) 我想在我的查询中使用多个order,我使用LINQ.i是LINQ的新手,我已经尝试了stackoverflow上给出的示例.但我不知道为什么这些不适合我,我相信我错了.以下是我的情况.我有一个使用LINQ创建的项目.我没有设置列顺序的任务.实际上我的任务是什么,现在有一个列创建日期.现在我想使用Createddate以及sortOrder列进行排序.Below是用于它的代码:页面加载方法中的代码
ViewState["SortDirection"] = "desc";
ViewState["SortColumn"] = "createddate";
BindAllTopics(ViewState["SortDirection"].ToString(), ViewState["SortColumn"].ToString());
Run Code Online (Sandbox Code Playgroud)
我的BindAllTopic方法如下:
protected void BindAllTopics(string SortType, string SortColumn)
{
var LstTopics = (from topic in Dbobj.T_topic select topic).ToList();
if (LstTopics.Count() > 0)
{
if (SortType == "ASC")
{
LstTopics = LstTopics.OrderBy(q => q.Name).ToList();
}
else
{
LstTopics = LstTopics.OrderByDescending(q => q.Name).ThenBy(q => q.SortOrder).ToList();
}
GrdTopics.DataSource = LstTopics.ToList();
GrdTopics.PageSize = 25;
GrdTopics.DataBind();
}
else
{
GrdTopics.DataSource = null;
GrdTopics.DataBind();
lblMsg.DisplayMessage(StatusMessages.InfoMessage, "No Topics Found.");
}
}
Run Code Online (Sandbox Code Playgroud)
我想先按排序顺序排序,它是int类型,然后是Createddate.
请帮我..
linq ×9
c# ×7
sorting ×3
expression ×2
lambda ×2
.net ×1
asp.net ×1
asp.net-mvc ×1
generics ×1
icomparer ×1
linq-to-sql ×1
nhibernate ×1
queryover ×1
sql-order-by ×1
wpf ×1