假设我的数据库中有一个名为Stuff的东西,名为Id.从用户那里我得到一系列选定的Range对象(或者我是从输入中创建它们)和他们想要的ID.该结构的精简版本如下所示:
public struct Range<T> : IEquatable<Range<T>>, IEqualityComparer<Range<T>>
{
public T A;
public T B;
public Range(T a, T b)
{
A = a;
B = b;
}
...
}
Run Code Online (Sandbox Code Playgroud)
所以有人可以得到:
var selectedRange = new List<Range<int>>
{
new Range(1, 4),
new Range(7,11),
};
Run Code Online (Sandbox Code Playgroud)
然后我想用它来创建一个谓词,只选择那些之间具有值的东西.例如,使用PredicateBuilder,我可以这样做:
var predicate = PredicateBuilder.False<Stuff>();
foreach (Range<int> r in selectedRange)
{
int a = r.A;
int b = r.B;
predicate = predicate.Or(ø => ø.Id >= a && ø.Id <= b);
}
Run Code Online (Sandbox Code Playgroud)
然后:
var stuff = datacontext.Stuffs.Where(predicate).ToList(); …Run Code Online (Sandbox Code Playgroud) 你可以返回由两个或更多不同的子类组成的IQueryable吗?这是我尝试展示我的意思.它抛出错误:
System.NotSupportedException:Union或Concat中的类型具有以不同顺序分配的成员.
var a = from oi in db.OrderItems
where oi.OrderID == ID
&& oi.ListingID != null
select new OrderItemA {
// etc
} as OrderItem;
var b = from oi in db.OrderItems
where oi.OrderID == ID
&& oi.AdID != null
select new OrderItemB {
//etc
} as OrderItem;
return a.Concat<OrderItem>(b);
Run Code Online (Sandbox Code Playgroud)