【发布时间】:2015-06-02 09:22:40
【问题描述】:
我有一个 Linq 查询,它应该可以动态处理多个参数。根据 null 条件,Where 子句字符串应包含/排除在 Where 子句字符串中。我使用第三方 Dynamic Linq 库来实现这一点。这是下面的代码,
代码
var boo = (from b in db.Bibs
from inf in db.InfoTypes.Where(info => info.Id == b.InfoTypeId).DefaultIfEmpty()
from it in db.Items.Where(itms => itms.BibId == b.Id).DefaultIfEmpty()
from ic in db.Collections.Where(coll => coll.Id == it.CollectionId).DefaultIfEmpty()
from il in db.ItemLocations.Where(iloc => iloc.Id == it.LocationId).DefaultIfEmpty()
from aacc in db.AdminAccounts.Where(aacc => aacc.Id == b.CreatedBy).DefaultIfEmpty()
from bc in db.BibContents.Where(bc => bc.BibId == b.Id).DefaultIfEmpty()
.Where("inf.Description='E-Working Papers'")
select new Book
{
BibId = b.Id,
Type = inf.Description,
NoOfCopies = db.Items.Where(itms => itms.BibId == b.Id).Count(),
createdby = db.AdminAccounts.Where(acc => acc.Id == b.CreatedBy).Select(aac => aac.Name).FirstOrDefault(),
ModifiedBy = db.AdminAccounts.Where(acc => acc.Id == b.LastModifiedBy).Select(aac => aac.Name).FirstOrDefault(),
createdon = b.CreatedOn,
lastmodifiedon = b.LastModifiedOn,
catalogdate = b.CatalogDate
}).GroupBy(g => new { g.BibId }).Select(s => s.FirstOrDefault());
当我运行上面的代码时,我得到了
LINQ to Entities 无法识别方法 System.Linq.IQueryable[Vibrant_ClassLibrary.BibContent] Where[BibContent](System.Linq.IQueryable[Vibrant_ClassLibrary.BibContent], System.String, System.Object[]) 方法和此方法无法转换为商店表达式。
【问题讨论】:
-
这是一种非常强烈的代码气味,这表明应该在视图中完成此连接。 EF 或任何 ORM 都不能替代 SQL,这是应该不使用它们的情况之一。将 Book 实体映射到 View
-
这是来自客户端的强烈建议。实际上,我正在为使用 xml 作为数据源的 ssrs 报告执行此操作。所以,我必须使用 EF 进行数据逻辑。
标签: c# linq entity-framework