C# 如何通过实体框架按动态值排序?

C# 如何通过实体框架按动态值排序?,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我正在使用Entity Framework构建一个asp.net mvc应用程序,并尝试按列表排序。根据数据库中存在的名称,动态更改名称 bids = bids.OrderBy(s => s.PublisherName); 目标是: public string PublisherName { get { db.Publishers.Find(pubid).Name; } } 但我有个例外: LINQ to实体中不支持指定的类型成员“PublisherName”。仅支持初始值设定项、实体

我正在使用Entity Framework构建一个asp.net mvc应用程序,并尝试按列表排序。根据数据库中存在的名称,动态更改名称

bids = bids.OrderBy(s => s.PublisherName);
目标是:

public string PublisherName { get { db.Publishers.Find(pubid).Name; } }
但我有个例外:

LINQ to实体中不支持指定的类型成员“PublisherName”。仅支持初始值设定项、实体成员和实体导航属性

我能做什么?我怎样才能让它工作

谢谢

仅初始值设定项、实体成员和实体导航属性 支持

db.publisher.Find(pubid.Name)既不是初始值设定项,也不是实体成员,也不是导航属性

一种可能的方法是通过以下方式将其存储在内存中:


这将完美地工作,只要出价是对象的小列表

我相信
Bid
Publisher
是相关的,对吧?也许这对你有帮助

var bids = from t in context.Bids
           let u = t.Publishers.FirstOrDefault(i => i.Id == pubid)
           orderby u.Name
           select t;

未经测试的代码,不确定它是否适用于您

通过LINQ使用实体框架时,LINQ语句中的所有属性都转换为SQL。EF只理解简单的属性。它不理解如何转换包含实际代码逻辑的属性,这正是导致您看到的错误的原因。解决此问题的最简单方法是在实体框架之外对客户端进行排序。通常的方法是对未排序的结果调用
.ToList
,然后对结果列表进行排序,这将发生在客户端。

只要
bids
已经是一个过滤(小)对象列表,这是一个好主意。但千万不要这样做:
context.Bids.AsEnumerable()…
var bids = from t in context.Bids
           let u = t.Publishers.FirstOrDefault(i => i.Id == pubid)
           orderby u.Name
           select t;