我想在Linq语句中动态生成跨多个表跨多个表的谓词.在下面的代码片段中,我想使用PredicateBuilder或类似的构造来替换以下代码中的"where"语句:
更换:
public class Foo
{
public int FooId; // PK
public string Name;
}
public class Bar
{
public int BarId; // PK
public string Description;
public int FooId; // FK to Foo.PK
}
void Test()
{
IQueryable<Foo> fooQuery = null; // Stubbed out
IQueryable<Bar> barQuery = null; // Stubbed out
IQueryable<Foo> query =
from foo in fooQuery
join bar in barQuery on foo.FooId equals bar.FooId
where ((bar.Description == "barstring") || (foo.Name == "fooname"))
select foo;
}
Run Code Online (Sandbox Code Playgroud)
有类似的东西:
void …
Run Code Online (Sandbox Code Playgroud) 我一直在尝试将LINQ表达式重构为一个方法,并且已经遇到了" Internal .NET Framework Data Provider error 1025.
"和" The parameter 'xyz' was not bound in the specified LINQ to Entities query expression.
"异常.
以下是实体模型的相关部分(使用EF 4.2/LINQ to Entities):
public class Place : Entity
{
public string OfficialName { get; protected internal set; }
public virtual ICollection<PlaceName> { get; protected internal set; }
}
public class PlaceName : Entity
{
public string Text { get; protected internal set; }
public string AsciiEquivalent { get; protected internal set; }
public virtual Language …
Run Code Online (Sandbox Code Playgroud) linq-to-entities expression-trees predicatebuilder entity-framework-4 linqkit
我需要知道使用PredicateBuilder
.在几乎所有如何使用它的示例中,它们显示如下代码:
var predicate = PredicateBuilder.True<employee>();
if (!string.IsNullOrEmpty(txtAddress.Text))
predicate = predicate.And(e1 => e1.Address.Contains(txtAddress.Text));
if (!string.IsNullOrEmpty(txtEmpId.Text))
predicate = predicate.And(e1 => e1.Id == Convert.ToInt32(txtEmpId.Text));
if (!string.IsNullOrEmpty(txtDesc.Text))
predicate = predicate.And(e1 => e1.Desc.Contains(txtDesc.Text));
if (!string.IsNullOrEmpty(txtName.Text))
predicate = predicate.And(e1 => e1.Name.Contains(txtName.Text));
EmployeeDataContext edb= new EmployeeDataContext();
var emp = edb.Employees.Where(predicate);
grdEmployee.DataSource = emp.ToList();
grdEmployee.DataBind();
Run Code Online (Sandbox Code Playgroud)
那个Employee
对象是什么,大于和小于括号之间的对象是什么?我绞尽脑汁想着那个.我正在使用Linq到SQL实体,当我自己尝试这个时,我得到了编译错误.我认为错误是这样的:
"不能从Linq表中投射到......"
我是初学者.请原谅我询问可能是什么显而易见的事情.谢谢.
在我们的应用程序中,许多不同查询中出现的一组标准已经慢慢变得更加复杂.为了避免重复此代码,我想将这些条件拆分为一个方法,该方法将条件作为表达式返回,然后可以在必要时应用它:
public Expression<Func<Invoice, bool>> GetComplexPredicate()
{
// complex predicate is returned as an Expression:
return c => ...
}
Run Code Online (Sandbox Code Playgroud)
重复使用:
var result = repository.Invoice.Where(GetComplexPredicate())
Run Code Online (Sandbox Code Playgroud)
但是,下面的语句不会编译,因为c.Invoice只是一个ICollection.
var result = repository.Customer
.Where(c => c.Country == "US" && c.Invoice.Any(GetComplexPredicate()))
Run Code Online (Sandbox Code Playgroud)
是否可以使用这样的表达式?
c# linq-to-entities expression entity-framework predicatebuilder
我在使用Microsoft App Studio创建的项目中的一个名为Filter.cs的文件中找到了以下代码.虽然我是一名资深的C#程序员,但我缺乏LINQ谓词表达式构建器的经验.我可以告诉它下面的代码是"元逻辑",用于灵活地构建查询,给出包含类型字段信息的过滤谓词列表以及要注入子表达式的一组数据值.我无法弄清楚的是以下语句中的"表达式"变量:
query = query.Where(expression).AsQueryable()"
Run Code Online (Sandbox Code Playgroud)
..将每个字段的表达式连接成一个更复杂的查询表达式,最终在代码的末尾执行以创建ObservableCollection 结果.如果它是" query + = "我可以推断链接动作就像一个事件处理程序字段,但作为一个直接的赋值语句,它让我感到困惑,因为我希望它能替换表达式变量从最后一个循环迭代得到的最后一个值,从而在过程中重置它并丢失其先前的值.这里发生了什么?
public class Filter<T>
{
public static ObservableCollection<T> FilterCollection(
FilterSpecification filter, IEnumerable<T> data)
{
IQueryable<T> query = data.AsQueryable();
foreach (var predicate in filter.Predicates)
{
Func<T, bool> expression;
var predicateAux = predicate;
switch (predicate.Operator)
{
case ColumnOperatorEnum.Contains:
expression = x => predicateAux.GetFieldValue(x).ToLower().Contains(predicateAux.Value.ToString().ToLower());
break;
case ColumnOperatorEnum.StartsWith:
expression = x => predicateAux.GetFieldValue(x).ToLower().StartsWith(predicateAux.Value.ToString().ToLower());
break;
case ColumnOperatorEnum.GreaterThan:
expression = x => String.Compare(predicateAux.GetFieldValue(x).ToLower(), predicateAux.Value.ToString().ToLower(), StringComparison.Ordinal) > 0;
break;
case ColumnOperatorEnum.LessThan:
expression = …
Run Code Online (Sandbox Code Playgroud) 在 Entity Framework Core 中使用谓词构建器时出现以下错误。
源 IQueryable 没有实现 IAsyncEnumerable。只有实现 IAsyncEnumerable 的源才能用于实体框架异步操作。
这是代码 -
List<Member> results = await _context.Members.AsExpandable().Where(predicate).ToListAsync();
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的 EF 的确切版本
<package id="EntityFramework.Core" version="7.0.0-rc1-final" targetFramework="net451" />
Run Code Online (Sandbox Code Playgroud) entity-framework predicatebuilder linqkit entity-framework-core
我有一个这样的实体:
public class Product()
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想在Name
属性上搜索关键字,以便对它们进行 OR 运算。换句话说,搜索:
勺子刀叉
将在物业中寻找勺子 或 刀子 或 叉子Name
。我为PredicateBuilder
on引入了一种新方法,Product
如下所示:
public static Expression<Func<Product, bool>> ContainsKeywords(params string[] keywords)
{
var predicate = PredicateBuilder.True<Product>();
foreach (var keyword in keywords)
{
var temp = keyword;
predicate = predicate.Or(x => x.Name.Contains(temp));
}
return predicate;
}
Run Code Online (Sandbox Code Playgroud)
我在我的 Web 服务方法之一中像这样使用它:
var keywords = Request.QueryString["q"].Split(' ');
var products = Repo.GetAll<Product>(); // get all the products from …
Run Code Online (Sandbox Code Playgroud) 我对 PredicateBuilder 类有疑问。
我有一个像 3 类的。
public class A
{
public int val1 {get;set;}
public int val2 {get;set;}
public List<B> listb {get;set;}
}
public class B
{
public int val3 {get;set;}
public int val4 {get;set;}
public List<C> listc {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我如何在 B 类中搜索 val3 我需要这样的搜索:
var query = PredicateBuilder.True<A>();
query = query.And(x => x.listb.Where(b=> b.val3 == 1);
Run Code Online (Sandbox Code Playgroud) 假设我通过 LINQ 查询创建了一些匿名类型:
var query = from Person in db.People
join Pet in Pets on Person.ID equals Pet.PersonID
join Thingy in Thingies on Person.ID equals Thingy.PersonID
select new {
Person.ID,
PetName = Pet.Name,
Thing = Thingy.Thing,
OtherThing = Thingy.OtherThing
};
Run Code Online (Sandbox Code Playgroud)
现在我想通过动态构建谓词将一些复杂的表达式应用于查询。我对已知类型所做的事情是这样的:
var predicate = PredicateBuilder.False<MyType>();
predicate = predicate.Or(myType => myType.Flag);
if (someCondition) {
var subPredicate = PredicateBuilder.True<MyType>();
subPredicate = subPredicate.And(myType => myType.Thing == someThing);
subPredicate = subPredicate.And(myType => myType.OtherThing == someOtherThing);
predicate = predicate.Or(subPredicate);
}
query = query.Where(predicate);
Run Code Online (Sandbox Code Playgroud)
是否可以对匿名类型做类似的事情?我还没有找到一种使用匿名类型的方法,PredicateBuilder …
我有以下课程:
public class testClass
{
public string name { get; set; }
public int id { get; set; }
public int age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以及以下代码:
var list = new List<testClass>();
list.Add(new testClass { name = "name", id = 1, age = 30 });
list.Add(new testClass { name = "name", id = 2, age = 22 });
list.Add(new testClass { name = "name", id = 3, age = 20 });
list.Add(new testClass { name = "name", id = …
Run Code Online (Sandbox Code Playgroud) predicatebuilder ×10
linq ×7
c# ×6
linqkit ×2
expression ×1
filter ×1
ienumerable ×1
join ×1
lambda ×1
linq-to-sql ×1
sql ×1
where-clause ×1