C# 如何实现动态Linq
我有一个Linq查询,它应该动态地处理许多参数。基于null条件,Where子句字符串应包括/排除Where子句字符串。我使用第三方动态Linq库来实现这一点。下面是代码 代码C# 如何实现动态Linq,c#,linq,entity-framework,C#,Linq,Entity Framework,我有一个Linq查询,它应该动态地处理许多参数。基于null条件,Where子句字符串应包括/排除Where子句字符串。我使用第三方动态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
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\u ClassLibrary.BibContent]其中[BibContent](System.LINQ.IQueryable[Vibrant\u ClassLibrary.BibContent]、System.String、System.Object[])方法,并且无法将此方法转换为存储表达式
这是如上所述的类似问题。
您必须在
.Where(queryString)
调用之前插入.AsEnumerable()
;否则,实体框架会尝试转换查询字符串本身,但它无法转换。这是一种非常强烈的代码味道,这表明应该在视图中完成此连接。EF或任何ORM都不能替代SQL,这是不应该使用它们的情况之一。将Book实体映射到视图而不是相反这是客户端的强烈建议。实际上,我这样做是为了ssrs报告,它使用xml作为数据源。所以,我必须对数据逻辑使用EF。我使用了支持此功能的Dynamic.Linq库。看到链接了吗好的,现在我找到你了。那么这可能和这里描述的问题是一样的:你能通过修改我的代码来发布代码吗??我在where子句之前插入了.AsEnumerable()
。但它似乎不起作用。显示编译时错误。是否包含使用
指令导入动态Linq库的?让我们来看看。